import {getSheetIndex, getRangetxt} from '../methods/get'
import {replaceHtml, getObjType, chatatABC} from '../utils/util'
import formula from '../global/formula'
import {isRealNull, isEditMode} from '../global/validate'
import tooltip from '../global/tooltip'
import {luckysheetrefreshgrid} from '../global/refresh'
import {getcellvalue} from '../global/getdata'
import {genarate} from '../global/format'
import {modelHTML, luckysheet_CFiconsImg} from './constant'
import server from './server'
import {selectionCopyShow} from './select'
import sheetmanage from './sheetmanage'
import locale from '../locale/locale'
import {checkProtectionFormatCells} from './protection'
import Store from '../store'
import dayjs from 'dayjs'
import escapeHtml from 'escape-html'
import $ from 'jquery'

//Conditional Formatting
const conditionformat = {
    fileClone: [],
    editorRule: null,
    ruleTypeHtml: function () {
        const conditionformat_Text = locale().conditionformat

        return `<div class="ruleTypeBox">
                    <div class="ruleTypeItem">
                        <span class="icon iconfont luckysheet-iconfont-youjiantou"></span>
                        <span>${conditionformat_Text.ruleTypeItem1}</span>
                    </div>
                    <div class="ruleTypeItem">
                        <span class="icon iconfont luckysheet-iconfont-youjiantou"></span>
                        <span>${conditionformat_Text.ruleTypeItem2}</span>
                    </div>
                    <div class="ruleTypeItem">
                        <span class="icon iconfont luckysheet-iconfont-youjiantou"></span>
                        <span>${conditionformat_Text.ruleTypeItem3}</span>
                    </div>
                    <div class="ruleTypeItem">
                        <span class="icon iconfont luckysheet-iconfont-youjiantou"></span>
                        <span>${conditionformat_Text.ruleTypeItem4}</span>
                    </div>
                    <div class="ruleTypeItem">
                        <span class="icon iconfont luckysheet-iconfont-youjiantou"></span>
                        <span>${conditionformat_Text.ruleTypeItem5}</span>
                    </div>
                    <div class="ruleTypeItem">
                        <span class="icon iconfont luckysheet-iconfont-youjiantou"></span>
                        <span>${conditionformat_Text.ruleTypeItem6}</span>
                    </div>
                </div>`
    },
    textCellColorHtml: function () {
        const conditionformat_Text = locale().conditionformat

        return `<div id="textCellColor">
                    <div class="colorbox">
                        <input id="checkTextColor" type="checkbox" checked="checked">
                        <label for="checkTextColor">${conditionformat_Text.textColor}：</label>
                        <input id="textcolorshow" data-tips="${conditionformat_Text.textColor}" data-func="background" class="luckysheet-conditionformat-config-color" type="text" value="#9c0006" style="display: none;">
                    </div>
                    <div class="colorbox">
                        <input id="checkCellColor" type="checkbox" checked="checked">
                        <label for="checkCellColor">${conditionformat_Text.cellColor}：</label>
                        <input id="cellcolorshow" data-tips="${conditionformat_Text.cellColor}" data-func="background" class="luckysheet-conditionformat-config-color" type="text" value="#ffc7ce" style="display: none;">
                    </div>
                </div>`
    },
    selectRange: [],
    selectStatus: false,
    dataBarList: [
        {'format': ['#638ec6', '#ffffff']},
        {'format': ['#63c384', '#ffffff']},
        {'format': ['#ff555a', '#ffffff']},
        {'format': ['#ffb628', '#ffffff']},
        {'format': ['#008aef', '#ffffff']},
        {'format': ['#d6007b', '#ffffff']},

        {'format': ['#638ec6']},
        {'format': ['#63c384']},
        {'format': ['#ff555a']},
        {'format': ['#ffb628']},
        {'format': ['#008aef']},
        {'format': ['#d6007b']}
    ],
    colorGradationList: [
        {'format': ['rgb(99, 190, 123)', 'rgb(255, 235, 132)', 'rgb(248, 105, 107)']},
        {'format': ['rgb(248, 105, 107)', 'rgb(255, 235, 132)', 'rgb(99, 190, 123)']},

        {'format': ['rgb(99, 190, 123)', 'rgb(252, 252, 255)', 'rgb(248, 105, 107)']},
        {'format': ['rgb(248, 105, 107)', 'rgb(252, 252, 255)', 'rgb(99, 190, 123)']},

        {'format': ['rgb(90, 138, 198)', 'rgb(252, 252, 255)', 'rgb(248, 105, 107)']},
        {'format': ['rgb(248, 105, 107)', 'rgb(252, 252, 255)', 'rgb(90, 138, 198)']},

        {'format': ['rgb(252, 252, 255)', 'rgb(248, 105, 107)']},
        {'format': ['rgb(248, 105, 107)', 'rgb(252, 252, 255)']},

        {'format': ['rgb(99, 190, 123)', 'rgb(252, 252, 255)']},
        {'format': ['rgb(252, 252, 255)', 'rgb(99, 190, 123)']},

        {'format': ['rgb(99, 190, 123)', 'rgb(255, 235, 132)']},
        {'format': ['rgb(255, 235, 132)', 'rgb(99, 190, 123)']}
    ],
    init: function () {
        let _this = this

        const conditionformat_Text = locale().conditionformat

        // Management rules
        $(document).off('change.CFchooseSheet').on('change.CFchooseSheet', '#luckysheet-administerRule-dialog .chooseSheet', function () {
            let index = $('#luckysheet-administerRule-dialog .chooseSheet option:selected').val()
            _this.getConditionRuleList(index)
        })
        $(document).off('click.CFadministerRuleItem').on('click.CFadministerRuleItem', '#luckysheet-administerRule-dialog .ruleList .listBox .item', function () {
            $(this).addClass('on').siblings().removeClass('on')
        })

        $(document).off('click.CFadministerRuleConfirm').on('click.CFadministerRuleConfirm', '#luckysheet-administerRule-dialog-confirm', function () {
            if (!checkProtectionFormatCells(Store.currentSheetIndex)) {
                return
            }

            //Save the previous rules
            let fileH = $.extend(true, [], Store.luckysheetfile)
            let historyRules = _this.getHistoryRules(fileH)

            //Save current rules
            let fileClone = $.extend(true, [], _this.fileClone)
            for (let c = 0; c < fileClone.length; c++) {
                let sheetIndex = fileClone[c]['index']
                Store.luckysheetfile[getSheetIndex(sheetIndex)]['luckysheet_conditionformat_save'] = fileClone[getSheetIndex(sheetIndex)]['luckysheet_conditionformat_save']
            }

            let fileC = $.extend(true, [], Store.luckysheetfile)
            let currentRules = _this.getCurrentRules(fileC)

            //Refresh the table once
            _this.ref(historyRules, currentRules)

            //Hide some dom
            $('#luckysheet-modal-dialog-mask').hide()
            $('#luckysheet-administerRule-dialog').hide()

            //Send to background
            if (server.allowUpdate) {
                let files = $.extend(true, [], Store.luckysheetfile)
                for (let i = 0; i < files.length; i++) {
                    server.saveParam('all', files[i]['index'], files[i]['luckysheet_conditionformat_save'], {'k': 'luckysheet_conditionformat_save'})
                }
            }
        })

        $(document).off('click.CFadministerRuleClose').on('click.CFadministerRuleClose', '#luckysheet-administerRule-dialog-close', function () {
            $('#luckysheet-modal-dialog-mask').hide()
            $('#luckysheet-administerRule-dialog').hide()
            _this.fileClone = []
        })
        $(document).off('click.CFadministerRuleFa').on('click.CFadministerRuleFa', '#luckysheet-administerRule-dialog .item .fa-table', function () {
            $(this).parents('#luckysheet-administerRule-dialog').hide()

            let sheetIndex = $('#luckysheet-administerRule-dialog .chooseSheet select option:selected').val()
            if (sheetIndex != Store.currentSheetIndex) {
                sheetmanage.changeSheetExec(sheetIndex)
            }

            let txt = $(this).siblings('input').val().trim()
            let dataItem = $(this).parents('.item').attr('data-item')

            _this.multiRangeDialog(dataItem, txt)

            _this.selectRange = []

            let range = _this.getRangeByTxt(txt)
            if (range.length > 0) {
                for (let s = 0; s < range.length; s++) {
                    let r1 = range[s].row[0], r2 = range[s].row[1]
                    let c1 = range[s].column[0], c2 = range[s].column[1]

                    let row = Store.visibledatarow[r2],
                        row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1]
                    let col = Store.visibledatacolumn[c2],
                        col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1]

                    _this.selectRange.push({
                        'left': col_pre,
                        'width': col - col_pre - 1,
                        'top': row_pre,
                        'height': row - row_pre - 1,
                        'left_move': col_pre,
                        'width_move': col - col_pre - 1,
                        'top_move': row_pre,
                        'height_move': row - row_pre - 1,
                        'row': [r1, r2],
                        'column': [c1, c2],
                        'row_focus': r1,
                        'column_focus': c1
                    })
                }
            }

            selectionCopyShow(_this.selectRange)
        })
        $(document).off('click.CFmultiRangeConfirm').on('click.CFmultiRangeConfirm', '#luckysheet-multiRange-dialog-confirm', function () {
            $(this).parents('#luckysheet-multiRange-dialog').hide()

            let dataItem = $(this).attr('data-item')
            let v = $(this).parents('#luckysheet-multiRange-dialog').find('input').val()
            $('#luckysheet-administerRule-dialog .item[data-item=' + dataItem + '] input').val(v)

            let sheetIndex = $('#luckysheet-administerRule-dialog .chooseSheet option:selected').val()
            _this.fileClone[getSheetIndex(sheetIndex)]['luckysheet_conditionformat_save'][dataItem].cellrange = _this.getRangeByTxt(v)

            $('#luckysheet-modal-dialog-mask').show()
            $('#luckysheet-administerRule-dialog').show()

            let range = []
            selectionCopyShow(range)
        })
        $(document).off('click.CFmultiRangeClose').on('click.CFmultiRangeClose', '#luckysheet-multiRange-dialog-close', function () {
            $(this).parents('#luckysheet-multiRange-dialog').hide()
            $('#luckysheet-modal-dialog-mask').show()
            $('#luckysheet-administerRule-dialog').show()

            $('#luckysheet-formula-functionrange-select').hide()
            $('#luckysheet-row-count-show').hide()
            $('#luckysheet-column-count-show').hide()

            let range = []
            selectionCopyShow(range)
        })

        // New rule
        $(document).off('click.CFnewConditionRule').on('click.CFnewConditionRule', '#newConditionRule', function () {
            let sheetIndex = $('#luckysheet-administerRule-dialog .chooseSheet option:selected').val()
            if (!checkProtectionFormatCells(sheetIndex)) {
                return
            }

            if (Store.luckysheet_select_save.length == 0) {
                if (isEditMode()) {
                    alert(conditionformat_Text.pleaseSelectRange)
                } else {
                    tooltip.info(conditionformat_Text.pleaseSelectRange, '')
                }
                return
            }

            _this.newConditionRuleDialog(1)
        })
        $(document).off('click.CFnewConditionRuleConfirm').on('click.CFnewConditionRuleConfirm', '#luckysheet-newConditionRule-dialog-confirm', function () {

            if (!checkProtectionFormatCells(Store.currentSheetIndex)) {
                return
            }

            let index = $('#luckysheet-newConditionRule-dialog .ruleTypeItem.on').index()
            let type1 = $('#luckysheet-newConditionRule-dialog #type1 option:selected').val()
            let type2 = $('#luckysheet-newConditionRule-dialog .' + type1 + 'Box #type2 option:selected').val()

            let format, rule
            if (index == 0) {
                if (type1 == 'dataBar') {
                    let color = $(this).parents('#luckysheet-newConditionRule-dialog').find('.dataBarBox .luckysheet-conditionformat-config-color').spectrum('get').toHexString()

                    if (type2 == 'gradient') {
                        format = [color, '#ffffff']
                    } else if (type2 == 'solid') {
                        format = [color]
                    }

                    rule = {
                        'type': 'dataBar',
                        'cellrange': $.extend(true, [], Store.luckysheet_select_save),
                        'format': format
                    }
                } else if (type1 == 'colorGradation') {
                    let maxcolor = $(this).parents('#luckysheet-newConditionRule-dialog').find('.colorGradationBox .maxVal .luckysheet-conditionformat-config-color').spectrum('get').toRgbString()
                    let midcolor = $(this).parents('#luckysheet-newConditionRule-dialog').find('.colorGradationBox .midVal .luckysheet-conditionformat-config-color').spectrum('get').toRgbString()
                    let mincolor = $(this).parents('#luckysheet-newConditionRule-dialog').find('.colorGradationBox .minVal .luckysheet-conditionformat-config-color').spectrum('get').toRgbString()

                    if (type2 == 'threeColor') { //三色
                        format = [maxcolor, midcolor, mincolor]
                    } else if (type2 == 'twoColor') { //双色
                        format = [maxcolor, mincolor]
                    }

                    rule = {
                        'type': 'colorGradation',
                        'cellrange': $.extend(true, [], Store.luckysheet_select_save),
                        'format': format
                    }
                } else if (type1 == 'icons') { //图标集
                    let len = $(this).parents('#luckysheet-newConditionRule-dialog').find('.iconsBox .model').attr('data-len')
                    let leftMin = $(this).parents('#luckysheet-newConditionRule-dialog').find('.iconsBox .model').attr('data-leftmin')
                    let top = $(this).parents('#luckysheet-newConditionRule-dialog').find('.iconsBox .model').attr('data-top')

                    format = {
                        'len': len,
                        'leftMin': leftMin,
                        'top': top
                    }

                    rule = {
                        'type': 'icons',
                        'cellrange': $.extend(true, [], Store.luckysheet_select_save),
                        'format': format
                    }
                }
            } else {
                let conditionName = '', conditionRange = [], conditionValue = []

                if (index == 1) {
                    if (type1 == 'number') { //单元格值
                        conditionName = type2

                        if (type2 == 'betweenness') {
                            let v1 = $('#luckysheet-newConditionRule-dialog #conditionVal input').val().trim()
                            let v2 = $('#luckysheet-newConditionRule-dialog #conditionVal2 input').val().trim()

                            //条件值是否是选区
                            let rangeArr1 = _this.getRangeByTxt(v1)
                            if (rangeArr1.length > 1) {
                                _this.infoDialog(conditionformat_Text.onlySingleCell, '')
                                return
                            } else if (rangeArr1.length == 1) {
                                let r1 = rangeArr1[0].row[0], r2 = rangeArr1[0].row[1]
                                let c1 = rangeArr1[0].column[0], c2 = rangeArr1[0].column[1]

                                if (r1 == r2 && c1 == c2) {
                                    v1 = getcellvalue(r1, c1, Store.flowdata)

                                    conditionRange.push({'row': rangeArr1[0].row, 'column': rangeArr1[0].column})
                                    conditionValue.push(v1)
                                } else {
                                    _this.infoDialog(conditionformat_Text.onlySingleCell, '')
                                    return
                                }
                            } else if (rangeArr1.length == 0) {
                                if (isNaN(v1) || v1 == '') {
                                    _this.infoDialog(conditionformat_Text.conditionValueCanOnly, '')
                                    return
                                } else {
                                    conditionValue.push(v1)
                                }
                            }

                            let rangeArr2 = _this.getRangeByTxt(v2)
                            if (rangeArr2.length > 1) {
                                _this.infoDialog(conditionformat_Text.onlySingleCell, '')
                                return
                            } else if (rangeArr2.length == 1) {
                                let r1 = rangeArr2[0].row[0], r2 = rangeArr2[0].row[1]
                                let c1 = rangeArr2[0].column[0], c2 = rangeArr2[0].column[1]

                                if (r1 == r2 && c1 == c2) {
                                    v2 = getcellvalue(r1, c1, Store.flowdata)

                                    conditionRange.push({'row': rangeArr2[0].row, 'column': rangeArr2[0].column})
                                    conditionValue.push(v2)
                                } else {
                                    _this.infoDialog(conditionformat_Text.onlySingleCell, '')
                                    return
                                }
                            } else if (rangeArr2.length == 0) {
                                if (isNaN(v2) || v2 == '') {
                                    _this.infoDialog(conditionformat_Text.conditionValueCanOnly, '')
                                    return
                                } else {
                                    conditionValue.push(v2)
                                }
                            }
                        } else {
                            //条件值
                            let v = $('#luckysheet-newConditionRule-dialog #conditionVal input').val().trim()

                            //条件值是否是选区
                            let rangeArr = _this.getRangeByTxt(v)
                            if (rangeArr.length > 1) {
                                _this.infoDialog(conditionformat_Text.onlySingleCell, '')
                                return
                            } else if (rangeArr.length == 1) {
                                let r1 = rangeArr[0].row[0], r2 = rangeArr[0].row[1]
                                let c1 = rangeArr[0].column[0], c2 = rangeArr[0].column[1]

                                if (r1 == r2 && c1 == c2) {
                                    v = getcellvalue(r1, c1, Store.flowdata)

                                    conditionRange.push({'row': rangeArr[0].row, 'column': rangeArr[0].column})
                                    conditionValue.push(v)
                                } else {
                                    _this.infoDialog(conditionformat_Text.onlySingleCell, '')
                                    return
                                }
                            } else if (rangeArr.length == 0) {
                                if (isNaN(v) || v == '') {
                                    _this.infoDialog(conditionformat_Text.conditionValueCanOnly, '')
                                    return
                                } else {
                                    conditionValue.push(v)
                                }
                            }
                        }
                    } else if (type1 == 'text') { //特定文本
                        conditionName = 'textContains'

                        //条件值
                        let v = $('#luckysheet-newConditionRule-dialog #conditionVal input').val().trim()

                        //条件值是否是选区
                        let rangeArr = _this.getRangeByTxt(v)
                        if (rangeArr.length > 1) {
                            _this.infoDialog(conditionformat_Text.onlySingleCell, '')
                            return
                        } else if (rangeArr.length == 1) {
                            let r1 = rangeArr[0].row[0], r2 = rangeArr[0].row[1]
                            let c1 = rangeArr[0].column[0], c2 = rangeArr[0].column[1]

                            if (r1 == r2 && c1 == c2) {
                                v = getcellvalue(r1, c1, Store.flowdata)

                                conditionRange.push({'row': rangeArr[0].row, 'column': rangeArr[0].column})
                                conditionValue.push(v)
                            } else {
                                _this.infoDialog(conditionformat_Text.onlySingleCell, '')
                                return
                            }
                        } else if (rangeArr.length == 0) {
                            if (v == '') {
                                _this.infoDialog(conditionformat_Text.conditionValueCanOnly, '')
                                return
                            } else {
                                conditionValue.push(v)
                            }
                        }
                    } else if (type1 == 'date') { //发生日期
                        conditionName = 'occurrenceDate'

                        //条件值
                        let v = $('#luckysheet-newConditionRule-dialog #daterange-btn').val()

                        if (v == '' || v == null) {
                            _this.infoDialog(conditionformat_Text.pleaseSelectADate, '')
                            return
                        }

                        conditionValue.push(v)
                    }
                } else if (index == 2) { //排名靠前靠后
                    //条件名称
                    if (type1 == 'top') {
                        if ($('#luckysheet-newConditionRule-dialog #isPercent').is(':selected')) {
                            conditionName = 'top10%'
                        } else {
                            conditionName = 'top10'
                        }
                    } else if (type1 == 'last') {
                        if ($('#luckysheet-newConditionRule-dialog #isPercent').is(':selected')) {
                            conditionName = 'last10%'
                        } else {
                            conditionName = 'last10'
                        }
                    }

                    //条件值
                    let v = $('#luckysheet-newConditionRule-dialog #conditionVal input').val().trim()

                    if (parseInt(v) != v || parseInt(v) < 1 || parseInt(v) > 1000) {
                        _this.infoDialog(conditionformat_Text.pleaseEnterInteger, '')
                        return
                    }

                    conditionValue.push(parseInt(v))
                } else if (index == 3) { //平均值
                    if (type1 == 'AboveAverage') {
                        conditionName = 'AboveAverage'
                        conditionValue.push('AboveAverage')
                    } else if (type1 == 'SubAverage') {
                        conditionName = 'SubAverage'
                        conditionValue.push('SubAverage')
                    }
                } else if (index == 4) { //重复值
                    conditionName = 'duplicateValue'
                    conditionValue.push(type1)
                } else if (index == 5) { //公式
                    conditionName = 'formula'

                    //条件值
                    let v = $('#luckysheet-newConditionRule-dialog #formulaConditionVal input').val().trim()

                    if (v == '') {
                        _this.infoDialog('Condition value cannot be empty!', '')
                        return
                    }

                    conditionValue.push(v)
                }

                //格式颜色
                let textcolor
                if ($('#luckysheet-newConditionRule-dialog #checkTextColor').is(':checked')) {
                    textcolor = $('#luckysheet-newConditionRule-dialog #textcolorshow').spectrum('get').toHexString()
                } else {
                    textcolor = null
                }

                let cellcolor
                if ($('#luckysheet-newConditionRule-dialog #checkCellColor').is(':checked')) {
                    cellcolor = $('#luckysheet-newConditionRule-dialog #cellcolorshow').spectrum('get').toHexString()
                } else {
                    cellcolor = null
                }

                format = {
                    'textColor': textcolor,
                    'cellColor': cellcolor
                }

                rule = {
                    'type': 'default',
                    'cellrange': $.extend(true, [], Store.luckysheet_select_save),
                    'format': format,
                    'conditionName': conditionName,
                    'conditionRange': conditionRange,
                    'conditionValue': conditionValue
                }
            }

            $('#luckysheet-newConditionRule-dialog').hide()

            //新建规则的入口
            let source = $(this).attr('data-source')

            if (source == 0) {
                $('#luckysheet-modal-dialog-mask').hide()

                //保存之前的规则
                let fileH = $.extend(true, [], Store.luckysheetfile)
                let historyRules = _this.getHistoryRules(fileH)

                //保存当前的规则
                let ruleArr = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)]['luckysheet_conditionformat_save'] == undefined ? [] : Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)]['luckysheet_conditionformat_save']
                ruleArr.push(rule)
                Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)]['luckysheet_conditionformat_save'] = ruleArr

                let fileC = $.extend(true, [], Store.luckysheetfile)
                let currentRules = _this.getCurrentRules(fileC)

                //刷新一次表格
                _this.ref(historyRules, currentRules)

                //发送给后台
                if (server.allowUpdate) {
                    server.saveParam('all', Store.currentSheetIndex, ruleArr, {'k': 'luckysheet_conditionformat_save'})
                }
            } else if (source == 1) {
                //临时存储新规则
                let ruleArr = _this.fileClone[getSheetIndex(Store.currentSheetIndex)]['luckysheet_conditionformat_save'] ? _this.fileClone[getSheetIndex(Store.currentSheetIndex)]['luckysheet_conditionformat_save'] : []
                ruleArr.push(rule)
                _this.fileClone[getSheetIndex(Store.currentSheetIndex)]['luckysheet_conditionformat_save'] = ruleArr

                //新建规则隐藏，管理规则显示
                _this.administerRuleDialog()
            }
        })
        $(document).off('click.CFnewConditionRuleClose').on('click.CFnewConditionRuleClose', '#luckysheet-newConditionRule-dialog-close', function () {
            //新建规则的入口
            let source = $(this).attr('data-source')
            if (source == 0) {
                $('#luckysheet-modal-dialog-mask').hide()
            }
            if (source == 1) {
                $('#luckysheet-administerRule-dialog').show()
            }

            //新建规则隐藏
            $('#luckysheet-newConditionRule-dialog').hide()

            //隐藏虚线框
            $('#luckysheet-formula-functionrange-select').hide()
            $('#luckysheet-row-count-show').hide()
            $('#luckysheet-column-count-show').hide()
        })

        // 编辑规则
        $(document).off('click.CFeditorConditionRule').on('click.CFeditorConditionRule', '#editorConditionRule', function () {

            let sheetIndex = $('#luckysheet-administerRule-dialog .chooseSheet option:selected').val()

            if (!checkProtectionFormatCells(sheetIndex)) {
                return
            }


            let itemIndex = $('#luckysheet-administerRule-dialog .ruleList .listBox .item.on').attr('data-item')
            let rule = {
                'sheetIndex': sheetIndex,
                'itemIndex': itemIndex,
                'data': _this.fileClone[getSheetIndex(sheetIndex)]['luckysheet_conditionformat_save'][itemIndex]
            }
            _this.editorRule = rule
            _this.editorConditionRuleDialog()
        })
        $(document).off('click.CFeditorConditionRuleConfirm').on('click.CFeditorConditionRuleConfirm', '#luckysheet-editorConditionRule-dialog-confirm', function () {
            let index = $('#luckysheet-editorConditionRule-dialog .ruleTypeItem.on').index()
            let type1 = $('#luckysheet-editorConditionRule-dialog #type1 option:selected').val()
            let type2 = $('#luckysheet-editorConditionRule-dialog .' + type1 + 'Box #type2 option:selected').val()

            let cellrange = _this.editorRule['data'].cellrange

            let format, rule
            if (index == 0) {
                if (type1 == 'dataBar') { //数据条
                    let color = $(this).parents('#luckysheet-editorConditionRule-dialog').find('.dataBarBox .luckysheet-conditionformat-config-color').spectrum('get').toHexString()

                    if (type2 == 'gradient') { //渐变填充
                        format = [color, '#ffffff']
                    } else if (type2 == 'solid') { //实心填充
                        format = [color]
                    }

                    rule = {
                        'type': 'dataBar',
                        'cellrange': cellrange,
                        'format': format
                    }
                } else if (type1 == 'colorGradation') { //色阶
                    let maxcolor = $(this).parents('#luckysheet-editorConditionRule-dialog').find('.colorGradationBox .maxVal .luckysheet-conditionformat-config-color').spectrum('get').toRgbString()
                    let midcolor = $(this).parents('#luckysheet-editorConditionRule-dialog').find('.colorGradationBox .midVal .luckysheet-conditionformat-config-color').spectrum('get').toRgbString()
                    let mincolor = $(this).parents('#luckysheet-editorConditionRule-dialog').find('.colorGradationBox .minVal .luckysheet-conditionformat-config-color').spectrum('get').toRgbString()

                    if (type2 == 'threeColor') { //三色
                        format = [maxcolor, midcolor, mincolor]
                    } else if (type2 == 'twoColor') { //双色
                        format = [maxcolor, mincolor]
                    }

                    rule = {
                        'type': 'colorGradation',
                        'cellrange': cellrange,
                        'format': format
                    }
                } else if (type1 == 'icons') { //图标集
                    let len = $(this).parents('#luckysheet-editorConditionRule-dialog').find('.iconsBox .model').attr('data-len')
                    let leftMin = $(this).parents('#luckysheet-editorConditionRule-dialog').find('.iconsBox .model').attr('data-leftmin')
                    let top = $(this).parents('#luckysheet-editorConditionRule-dialog').find('.iconsBox .model').attr('data-top')

                    format = {
                        'len': len,
                        'leftMin': leftMin,
                        'top': top
                    }

                    rule = {
                        'type': 'icons',
                        'cellrange': cellrange,
                        'format': format
                    }
                }
            } else {
                let conditionName = '', conditionRange = [], conditionValue = []

                if (index == 1) {
                    if (type1 == 'number') { //单元格值
                        conditionName = type2

                        if (type2 == 'betweenness') {
                            let v1 = $('#luckysheet-editorConditionRule-dialog #conditionVal input').val().trim()
                            let v2 = $('#luckysheet-editorConditionRule-dialog #conditionVal2 input').val().trim()

                            //条件值是否是选区
                            let rangeArr1 = _this.getRangeByTxt(v1)
                            if (rangeArr1.length > 1) {
                                _this.infoDialog(conditionformat_Text.onlySingleCell, '')
                                return
                            } else if (rangeArr1.length == 1) {
                                let r1 = rangeArr1[0].row[0], r2 = rangeArr1[0].row[1]
                                let c1 = rangeArr1[0].column[0], c2 = rangeArr1[0].column[1]

                                if (r1 == r2 && c1 == c2) {
                                    v1 = getcellvalue(r1, c1, Store.flowdata)

                                    conditionRange.push({'row': rangeArr1[0].row, 'column': rangeArr1[0].column})
                                    conditionValue.push(v1)
                                } else {
                                    _this.infoDialog(conditionformat_Text.onlySingleCell, '')
                                    return
                                }
                            } else if (rangeArr1.length == 0) {
                                if (isNaN(v1) || v1 == '') {
                                    _this.infoDialog(conditionformat_Text.conditionValueCanOnly, '')
                                    return
                                } else {
                                    conditionValue.push(v1)
                                }
                            }

                            let rangeArr2 = _this.getRangeByTxt(v2)
                            if (rangeArr2.length > 1) {
                                _this.infoDialog(conditionformat_Text.onlySingleCell, '')
                                return
                            } else if (rangeArr2.length == 1) {
                                let r1 = rangeArr2[0].row[0], r2 = rangeArr2[0].row[1]
                                let c1 = rangeArr2[0].column[0], c2 = rangeArr2[0].column[1]

                                if (r1 == r2 && c1 == c2) {
                                    v2 = getcellvalue(r1, c1, Store.flowdata)

                                    conditionRange.push({'row': rangeArr2[0].row, 'column': rangeArr2[0].column})
                                    conditionValue.push(v2)
                                } else {
                                    _this.infoDialog(conditionformat_Text.onlySingleCell, '')
                                    return
                                }
                            } else if (rangeArr2.length == 0) {
                                if (isNaN(v2) || v2 == '') {
                                    _this.infoDialog(conditionformat_Text.conditionValueCanOnly, '')
                                    return
                                } else {
                                    conditionValue.push(v2)
                                }
                            }
                        } else {
                            //条件值
                            let v = $('#luckysheet-editorConditionRule-dialog #conditionVal input').val().trim()

                            //条件值是否是选区
                            let rangeArr = _this.getRangeByTxt(v)
                            if (rangeArr.length > 1) {
                                _this.infoDialog(conditionformat_Text.onlySingleCell, '')
                                return
                            } else if (rangeArr.length == 1) {
                                let r1 = rangeArr[0].row[0], r2 = rangeArr[0].row[1]
                                let c1 = rangeArr[0].column[0], c2 = rangeArr[0].column[1]

                                if (r1 == r2 && c1 == c2) {
                                    v = getcellvalue(r1, c1, Store.flowdata)

                                    conditionRange.push({'row': rangeArr[0].row, 'column': rangeArr[0].column})
                                    conditionValue.push(v)
                                } else {
                                    _this.infoDialog(conditionformat_Text.onlySingleCell, '')
                                    return
                                }
                            } else if (rangeArr.length == 0) {
                                if (isNaN(v) || v == '') {
                                    _this.infoDialog(conditionformat_Text.conditionValueCanOnly, '')
                                    return
                                } else {
                                    conditionValue.push(v)
                                }
                            }
                        }
                    } else if (type1 == 'text') { //特定文本
                        conditionName = 'textContains'

                        //条件值
                        let v = $('#luckysheet-editorConditionRule-dialog #conditionVal input').val().trim()

                        //条件值是否是选区
                        let rangeArr = _this.getRangeByTxt(v)
                        if (rangeArr.length > 1) {
                            _this.infoDialog(conditionformat_Text.onlySingleCell, '')
                            return
                        } else if (rangeArr.length == 1) {
                            let r1 = rangeArr[0].row[0], r2 = rangeArr[0].row[1]
                            let c1 = rangeArr[0].column[0], c2 = rangeArr[0].column[1]

                            if (r1 == r2 && c1 == c2) {
                                v = getcellvalue(r1, c1, Store.flowdata)

                                conditionRange.push({'row': rangeArr[0].row, 'column': rangeArr[0].column})
                                conditionValue.push(v)
                            } else {
                                _this.infoDialog(conditionformat_Text.onlySingleCell, '')
                                return
                            }
                        } else if (rangeArr.length == 0) {
                            if (isNaN(v) || v == '') {
                                _this.infoDialog(conditionformat_Text.conditionValueCanOnly, '')
                                return
                            } else {
                                conditionValue.push(v)
                            }
                        }
                    } else if (type1 == 'date') { //发生日期
                        conditionName = 'occurrenceDate'

                        //条件值
                        let v = $('#luckysheet-editorConditionRule-dialog #daterange-btn').val()

                        if (v == '' || v == null) {
                            _this.infoDialog(conditionformat_Text.pleaseSelectADate, '')
                            return
                        }

                        conditionValue.push(v)
                    }
                } else if (index == 2) { //排名靠前靠后
                    //条件名称
                    if (type1 == 'top') {
                        if ($('#luckysheet-editorConditionRule-dialog #isPercent').is(':selected')) {
                            conditionName = 'top10%'
                        } else {
                            conditionName = 'top10'
                        }
                    } else if (type1 == 'last') {
                        if ($('#luckysheet-editorConditionRule-dialog #isPercent').is(':selected')) {
                            conditionName = 'last10%'
                        } else {
                            conditionName = 'last10'
                        }
                    }

                    //条件值
                    let v = $('#luckysheet-editorConditionRule-dialog #conditionVal input').val().trim()

                    if (parseInt(v) != v || parseInt(v) < 1 || parseInt(v) > 1000) {
                        _this.infoDialog(conditionformat_Text.pleaseEnterInteger, '')
                        return
                    }

                    conditionValue.push(v)
                } else if (index == 3) { //平均值
                    if (type1 == 'AboveAverage') {
                        conditionName = 'AboveAverage'
                        conditionValue.push('AboveAverage')
                    } else if (type1 == 'SubAverage') {
                        conditionName = 'SubAverage'
                        conditionValue.push('SubAverage')
                    }
                } else if (index == 4) { //重复值
                    conditionName = 'duplicateValue'
                    conditionValue.push(type1)
                } else if (index == 5) { //公式
                    conditionName = 'formula'

                    //条件值
                    let v = $('#luckysheet-editorConditionRule-dialog #formulaConditionVal input').val().trim()

                    if (v == '') {
                        _this.infoDialog('Condition value cannot be empty!', '')
                        return
                    }

                    conditionValue.push(v)
                }

                //格式颜色
                let textcolor
                if ($('#luckysheet-editorConditionRule-dialog #checkTextColor').is(':checked')) {
                    textcolor = $('#luckysheet-editorConditionRule-dialog #textcolorshow').spectrum('get').toHexString()
                } else {
                    textcolor = null
                }

                let cellcolor
                if ($('#luckysheet-editorConditionRule-dialog #checkCellColor').is(':checked')) {
                    cellcolor = $('#luckysheet-editorConditionRule-dialog #cellcolorshow').spectrum('get').toHexString()
                } else {
                    cellcolor = null
                }

                format = {
                    'textColor': textcolor,
                    'cellColor': cellcolor
                }

                rule = {
                    'type': 'default',
                    'cellrange': cellrange,
                    'format': format,
                    'conditionName': conditionName,
                    'conditionRange': conditionRange,
                    'conditionValue': conditionValue
                }
            }

            //修改编辑的规则
            let sheetIndex = _this.editorRule['sheetIndex']
            let itemIndex = _this.editorRule['itemIndex']
            _this.fileClone[getSheetIndex(sheetIndex)]['luckysheet_conditionformat_save'][itemIndex] = rule

            //编辑规则隐藏，管理规则显示
            $('#luckysheet-editorConditionRule-dialog').hide()
            _this.administerRuleDialog()
        })
        $(document).off('click.CFeditorConditionRuleClose').on('click.CFeditorConditionRuleClose', '#luckysheet-editorConditionRule-dialog-close', function () {
            //编辑规则隐藏，管理规则显示
            $('#luckysheet-editorConditionRule-dialog').hide()
            $('#luckysheet-administerRule-dialog').show()
            //隐藏虚线框
            $('#luckysheet-formula-functionrange-select').hide()
            $('#luckysheet-row-count-show').hide()
            $('#luckysheet-column-count-show').hide()
        })

        // 新建规则、编辑规则 类型切换
        $(document).off('click.CFnewEditorRuleItem').on('click.CFnewEditorRuleItem', '.luckysheet-newEditorRule-dialog .ruleTypeItem', function () {
            $(this).addClass('on').siblings().removeClass('on')

            let index = $(this).index()
            $(this).parents('.luckysheet-newEditorRule-dialog').find('.ruleExplainBox').html(_this.getRuleExplain(index))

            _this.colorSelectInit()
        })
        $(document).off('change.CFnewEditorRuleType1').on('change.CFnewEditorRuleType1', '.luckysheet-newEditorRule-dialog #type1', function () {
            let optionVal = $(this).find('option:selected').val()

            if (optionVal == 'dataBar' || optionVal == 'colorGradation' || optionVal == 'icons' || optionVal == 'number' || optionVal == 'text' || optionVal == 'date') {
                $(this).parents('.luckysheet-newEditorRule-dialog').find('.' + optionVal + 'Box').show().siblings().hide()
            }

            if (optionVal == 'date') {
                _this.daterangeInit($(this).parents('.luckysheet-newEditorRule-dialog').attr('id'))
            }
        })
        $(document).off('change.CFnewEditorRuleType2').on('change.CFnewEditorRuleType2', '.luckysheet-newEditorRule-dialog #type2', function () {
            let type1 = $(this).parents('.luckysheet-newEditorRule-dialog').find('#type1 option:selected').val()

            if (type1 == 'colorGradation') {
                let type2 = $(this).find('option:selected').val()

                if (type2 == 'threeColor') {
                    $(this).parents('.luckysheet-newEditorRule-dialog').find('.midVal').show()
                } else {
                    $(this).parents('.luckysheet-newEditorRule-dialog').find('.midVal').hide()
                }
            } else if (type1 == 'number') {
                let type2 = $(this).find('option:selected').val()

                if (type2 == 'betweenness') {
                    $(this).parents('.luckysheet-newEditorRule-dialog').find('.txt').show()
                    $(this).parents('.luckysheet-newEditorRule-dialog').find('#conditionVal2').show()
                } else {
                    $(this).parents('.luckysheet-newEditorRule-dialog').find('.txt').hide()
                    $(this).parents('.luckysheet-newEditorRule-dialog').find('#conditionVal2').hide()
                }
            }
        })
        $(document).off('click.CFiconsShowbox').on('click.CFiconsShowbox', '.luckysheet-newEditorRule-dialog .iconsBox .showbox', function () {
            $(this).parents('.iconsBox').find('ul').toggle()
        })
        $(document).off('click.CFiconsLi').on('click.CFiconsLi', '.luckysheet-newEditorRule-dialog .iconsBox li', function () {
            let len = $(this).find('div').attr('data-len')
            let leftmin = $(this).find('div').attr('data-leftmin')
            let top = $(this).find('div').attr('data-top')
            let title = $(this).find('div').attr('title')
            let position = $(this).find('div').css('background-position')

            $(this).parents('.iconsBox').find('.showbox .model').css('background-position', position)
            $(this).parents('.iconsBox').find('.showbox .model').attr('data-len', len)
            $(this).parents('.iconsBox').find('.showbox .model').attr('data-leftmin', leftmin)
            $(this).parents('.iconsBox').find('.showbox .model').attr('data-top', top)
            $(this).parents('.iconsBox').find('.showbox .model').attr('title', title)

            $(this).parents('ul').hide()
        })

        // 删除规则
        $(document).off('click.CFdeleteConditionRule').on('click.CFdeleteConditionRule', '#deleteConditionRule', function () {
            let sheetIndex = $('#luckysheet-administerRule-dialog .chooseSheet option:selected').val()

            if (!checkProtectionFormatCells(sheetIndex)) {
                return
            }

            let itemIndex = $('#luckysheet-administerRule-dialog .ruleList .listBox .item.on').attr('data-item')
            _this.fileClone[getSheetIndex(sheetIndex)]['luckysheet_conditionformat_save'].splice(itemIndex, 1)
            _this.administerRuleDialog()
        })

        // 规则子菜单弹出层 点击确定修改样式
        $(document).off('click.CFdefault').on('click.CFdefault', '#luckysheet-conditionformat-dialog-confirm', function () {

            if (!checkProtectionFormatCells(Store.currentSheetIndex)) {
                return
            }

            //条件名称
            let conditionName = $('#luckysheet-conditionformat-dialog .box').attr('data-itemvalue')

            //条件单元格
            let conditionRange = []

            //条件值
            let conditionValue = []
            if (conditionName == 'greaterThan' || conditionName == 'lessThan' || conditionName == 'equal' || conditionName == 'textContains') {
                let v = $('#luckysheet-conditionformat-dialog #conditionVal').val().trim()

                //条件值是否是选区
                let rangeArr = _this.getRangeByTxt(v)
                if (rangeArr.length > 1) {
                    _this.infoDialog(conditionformat_Text.onlySingleCell, '')
                    return
                } else if (rangeArr.length == 1) {
                    let r1 = rangeArr[0].row[0], r2 = rangeArr[0].row[1]
                    let c1 = rangeArr[0].column[0], c2 = rangeArr[0].column[1]

                    if (r1 == r2 && c1 == c2) {
                        v = getcellvalue(r1, c1, Store.flowdata)

                        conditionRange.push({'row': rangeArr[0].row, 'column': rangeArr[0].column})
                        conditionValue.push(v)
                    } else {
                        _this.infoDialog(conditionformat_Text.onlySingleCell, '')
                        return
                    }
                } else if (rangeArr.length == 0) {
                    if (isNaN(v) || v == '') {
                        _this.infoDialog(conditionformat_Text.conditionValueCanOnly, '')
                        return
                    } else {
                        conditionValue.push(v)
                    }
                }
            } else if (conditionName == 'betweenness') {//介于
                let v1 = $('#luckysheet-conditionformat-dialog #conditionVal').val().trim()
                let v2 = $('#luckysheet-conditionformat-dialog #conditionVal2').val().trim()

                //条件值是否是选区
                let rangeArr1 = _this.getRangeByTxt(v1)
                if (rangeArr1.length > 1) {
                    _this.infoDialog(conditionformat_Text.onlySingleCell, '')
                    return
                } else if (rangeArr1.length == 1) {
                    let r1 = rangeArr1[0].row[0], r2 = rangeArr1[0].row[1]
                    let c1 = rangeArr1[0].column[0], c2 = rangeArr1[0].column[1]

                    if (r1 == r2 && c1 == c2) {
                        v1 = getcellvalue(r1, c1, Store.flowdata)

                        conditionRange.push({'row': rangeArr1[0].row, 'column': rangeArr1[0].column})
                        conditionValue.push(v1)
                    } else {
                        _this.infoDialog(conditionformat_Text.onlySingleCell, '')
                        return
                    }
                } else if (rangeArr1.length == 0) {
                    if (isNaN(v1) || v1 == '') {
                        _this.infoDialog(conditionformat_Text.conditionValueCanOnly, '')
                        return
                    } else {
                        conditionValue.push(v1)
                    }
                }

                let rangeArr2 = _this.getRangeByTxt(v2)
                if (rangeArr2.length > 1) {
                    _this.infoDialog(conditionformat_Text.onlySingleCell, '')
                    return
                } else if (rangeArr2.length == 1) {
                    let r1 = rangeArr2[0].row[0], r2 = rangeArr2[0].row[1]
                    let c1 = rangeArr2[0].column[0], c2 = rangeArr2[0].column[1]

                    if (r1 == r2 && c1 == c2) {
                        v2 = getcellvalue(r1, c1, Store.flowdata)

                        conditionRange.push({'row': rangeArr2[0].row, 'column': rangeArr2[0].column})
                        conditionValue.push(v2)
                    } else {
                        _this.infoDialog(conditionformat_Text.onlySingleCell, '')
                        return
                    }
                } else if (rangeArr2.length == 0) {
                    if (isNaN(v2) || v2 == '') {
                        _this.infoDialog(conditionformat_Text.conditionValueCanOnly, '')
                        return
                    } else {
                        conditionValue.push(v2)
                    }
                }
            } else if (conditionName == 'occurrenceDate') {//日期
                let v = $('#luckysheet-conditionformat-dialog #daterange-btn').val()

                if (v == '' || v == null) {
                    _this.infoDialog(conditionformat_Text.pleaseSelectADate, '')
                    return
                }

                conditionValue.push(v)
            } else if (conditionName == 'duplicateValue') {//重复值
                conditionValue.push($('#luckysheet-conditionformat-dialog #conditionVal option:selected').val())
            } else if (conditionName == 'top10' || conditionName == 'top10%' || conditionName == 'last10' || conditionName == 'last10%') {
                let v = $('#luckysheet-conditionformat-dialog #conditionVal').val().trim()

                if (parseInt(v) != v || parseInt(v) < 1 || parseInt(v) > 1000) {
                    _this.infoDialog(conditionformat_Text.pleaseEnterInteger, '')
                    return
                }

                conditionValue.push(v)
            } else if (conditionName == 'AboveAverage') { //高于平均值
                conditionValue.push('AboveAverage')
            } else if (conditionName == 'SubAverage') { //低于平均值
                conditionValue.push('SubAverage')
            }

            //格式颜色
            let textcolor
            if ($('#checkTextColor').is(':checked')) {
                textcolor = $('#textcolorshow').spectrum('get').toHexString()
            } else {
                textcolor = null
            }

            let cellcolor
            if ($('#checkCellColor').is(':checked')) {
                cellcolor = $('#cellcolorshow').spectrum('get').toHexString()
            } else {
                cellcolor = null
            }

            //保存之前的规则
            let fileH = $.extend(true, [], Store.luckysheetfile)
            let historyRules = _this.getHistoryRules(fileH)

            //保存当前的规则
            let rule = {
                'type': 'default',
                'cellrange': $.extend(true, [], Store.luckysheet_select_save),
                'format': {
                    'textColor': textcolor,
                    'cellColor': cellcolor
                },
                'conditionName': conditionName,
                'conditionRange': conditionRange,
                'conditionValue': conditionValue
            }
            let ruleArr = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)]['luckysheet_conditionformat_save'] == undefined ? [] : Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)]['luckysheet_conditionformat_save']
            ruleArr.push(rule)
            Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)]['luckysheet_conditionformat_save'] = ruleArr

            let fileC = $.extend(true, [], Store.luckysheetfile)
            let currentRules = _this.getCurrentRules(fileC)

            //刷新一次表格
            _this.ref(historyRules, currentRules)

            //隐藏一些dom
            $('#luckysheet-modal-dialog-mask').hide()
            $('#luckysheet-conditionformat-dialog').hide()

            //发送给后台
            if (server.allowUpdate) {
                server.saveParam('all', Store.currentSheetIndex, ruleArr, {'k': 'luckysheet_conditionformat_save'})
            }
        })

        // 图标集弹出层 选择
        $(document).off('click.CFicons').on('click.CFicons', '#luckysheet-CFicons-dialog .item', function () {
            $('#luckysheet-modal-dialog-mask').hide()
            $('#luckysheet-CFicons-dialog').hide()

            if (Store.luckysheet_select_save.length > 0) {
                let cellrange = $.extend(true, [], Store.luckysheet_select_save)
                let format = {
                    'len': $(this).attr('data-len'),
                    'leftMin': $(this).attr('data-leftMin'),
                    'top': $(this).attr('data-top')
                }

                _this.updateItem('icons', cellrange, format)
            }
        })

        // 选择单元格
        $(document).on('click', '.range .fa-table', function () {
            let id = $(this).parents('.luckysheet-modal-dialog').attr('id')
            $('#' + id).hide()
            //入口
            let source

            if (id == 'luckysheet-conditionformat-dialog') {
                let $id = $(this).siblings('input').attr('id')

                if ($id == 'conditionVal') {
                    source = '0_1'
                } else {
                    source = '0_2'
                }
            } else if (id == 'luckysheet-newConditionRule-dialog') {
                let $id = $(this).parents('.range').attr('id')

                if ($id == 'formulaConditionVal') {
                    source = '1_0'
                } else if ($id == 'conditionVal') {
                    source = '1_1'
                } else {
                    source = '1_2'
                }
            } else if (id == 'luckysheet-editorConditionRule-dialog') {
                let $id = $(this).parents('.range').attr('id')

                if ($id == 'formulaConditionVal') {
                    source = '2_0'
                } else if ($id == 'conditionVal') {
                    source = '2_1'
                } else {
                    source = '2_2'
                }
            }
            //input值
            let v = $(this).siblings('input').val()

            _this.singleRangeDialog(source, v)
            selectionCopyShow(_this.getRangeByTxt(v))
        })
        $(document).on('click', '#luckysheet-singleRange-dialog-confirm', function () {
            $('#luckysheet-modal-dialog-mask').show()
            $(this).parents('#luckysheet-singleRange-dialog').hide()

            let source = $(this).attr('data-source')
            let v = $(this).parents('#luckysheet-singleRange-dialog').find('input').val()

            if (source == '0_1') {
                $('#luckysheet-conditionformat-dialog').show()
                $('#luckysheet-conditionformat-dialog #conditionVal').val(v)
            } else if (source == '0_2') {
                $('#luckysheet-conditionformat-dialog').show()
                $('#luckysheet-conditionformat-dialog #conditionVal2').val(v)
            } else if (source == '1_0') {
                $('#luckysheet-newConditionRule-dialog').show()
                $('#luckysheet-newConditionRule-dialog #formulaConditionVal input').val(v)
            } else if (source == '1_1') {
                $('#luckysheet-newConditionRule-dialog').show()
                $('#luckysheet-newConditionRule-dialog #conditionVal input').val(v)
            } else if (source == '1_2') {
                $('#luckysheet-newConditionRule-dialog').show()
                $('#luckysheet-newConditionRule-dialog #conditionVal2 input').val(v)
            } else if (source == '2_0') {
                $('#luckysheet-editorConditionRule-dialog').show()
                $('#luckysheet-editorConditionRule-dialog #formulaConditionVal input').val(v)
            } else if (source == '2_1') {
                $('#luckysheet-editorConditionRule-dialog').show()
                $('#luckysheet-editorConditionRule-dialog #conditionVal input').val(v)
            } else if (source == '2_2') {
                $('#luckysheet-editorConditionRule-dialog').show()
                $('#luckysheet-editorConditionRule-dialog #conditionVal2 input').val(v)
            }

            let range = []
            selectionCopyShow(range)
        })
        $(document).on('click', '#luckysheet-singleRange-dialog-close', function () {
            $('#luckysheet-modal-dialog-mask').show()
            $(this).parents('#luckysheet-singleRange-dialog').hide()

            let source = $(this).attr('data-source')
            if (source == '0_1' || source == '0_2') {
                $('#luckysheet-conditionformat-dialog').show()
            } else if (source == '1_0' || source == '1_1' || source == '1_2') {
                $('#luckysheet-newConditionRule-dialog').show()
            } else if (source == '2_0' || source == '2_1' || source == '2_2') {
                $('#luckysheet-editorConditionRule-dialog').show()
            }

            let range = []
            selectionCopyShow(range)
        })

        // 弹出层右上角关闭按钮
        $(document).on('click', '.luckysheet-modal-dialog-title-close', function () {
            let id = $(this).parents('.luckysheet-modal-dialog').attr('id')

            //新建规则弹出层
            if (id == 'luckysheet-newConditionRule-dialog') {
                let source = $('#' + id).find('#luckysheet-newConditionRule-dialog-close').attr('data-source')
                //新建规则入口
                if (source == 1) {
                    $('#luckysheet-administerRule-dialog').show()
                }
            }

            //编辑规则弹出层
            if (id == 'luckysheet-editorConditionRule-dialog') {
                $('#luckysheet-administerRule-dialog').show()
            }

            //选择单元格弹出层
            if (id == 'luckysheet-singleRange-dialog') {
                $('#luckysheet-modal-dialog-mask').show()

                let source = $(this).parents('#luckysheet-singleRange-dialog').find('#luckysheet-singleRange-dialog-confirm').attr('data-source')
                if (source == '0_1' || source == '0_2') {
                    $('#luckysheet-conditionformat-dialog').show()
                } else if (source == '1_1' || source == '1_2') {
                    $('#luckysheet-newConditionRule-dialog').show()
                } else if (source == '2_1' || source == '2_2') {
                    $('#luckysheet-editorConditionRule-dialog').show()
                }

                let range = []
                selectionCopyShow(range)
            }

            //选择应用范围弹出层
            if (id == 'luckysheet-multiRange-dialog') {
                $('#luckysheet-modal-dialog-mask').show()

                $('#luckysheet-administerRule-dialog').show()

                let range = []
                selectionCopyShow(range)
            }

            //提示框
            if (id == 'luckysheet-conditionformat-info-dialog') {
                $('#luckysheet-modal-dialog-mask').show()
            }
        })

        //提示框
        $(document).on('click', '#luckysheet-conditionformat-info-dialog-close', function () {
            $(this).parents('#luckysheet-conditionformat-info-dialog').hide()
        })
    },
    singleRangeDialog: function (source, value) {
        $('#luckysheet-modal-dialog-mask').hide()
        $('#luckysheet-singleRange-dialog').remove()

        const conditionformat_Text = locale().conditionformat

        $('body').append(replaceHtml(modelHTML, {
            'id': 'luckysheet-singleRange-dialog',
            'addclass': 'luckysheet-singleRange-dialog',
            'title': conditionformat_Text.selectCell,
            'content': `<input readonly="readonly" placeholder="${conditionformat_Text.pleaseSelectCell}" value="${escapeHtml(value)}"/>`,
            'botton': `<button id="luckysheet-singleRange-dialog-confirm" class="btn btn-primary" data-source="${escapeHtml(source)}">${conditionformat_Text.confirm}</button>
                        <button id="luckysheet-singleRange-dialog-close" class="btn btn-default" data-source="${escapeHtml(source)}">${conditionformat_Text.cancel}</button>`,
            'style': 'z-index:100003'
        }))
        let $t = $('#luckysheet-singleRange-dialog')
                .find('.luckysheet-modal-dialog-content')
                .css('min-width', 300)
                .end(),
            myh = $t.outerHeight(),
            myw = $t.outerWidth()
        let winw = $(window).width(), winh = $(window).height()
        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop()
        $('#luckysheet-singleRange-dialog').css({
            'left': (winw + scrollLeft - myw) / 2,
            'top': (winh + scrollTop - myh) / 3
        }).show()
    },
    multiRangeDialog: function (dataItem, value) {
        let _this = this

        $('#luckysheet-modal-dialog-mask').hide()
        $('#luckysheet-multiRange-dialog').remove()

        const conditionformat_Text = locale().conditionformat

        $('body').append(replaceHtml(modelHTML, {
            'id': 'luckysheet-multiRange-dialog',
            'addclass': 'luckysheet-multiRange-dialog',
            'title': conditionformat_Text.selectRange,
            'content': `<input readonly="readonly" placeholder="${conditionformat_Text.pleaseSelectRange}" value="${escapeHtml(value)}"/>`,
            'botton': `<button id="luckysheet-multiRange-dialog-confirm" class="btn btn-primary" data-item="${escapeHtml(dataItem)}">${conditionformat_Text.confirm}</button>
                        <button id="luckysheet-multiRange-dialog-close" class="btn btn-default">${conditionformat_Text.cancel}</button>`,
            'style': 'z-index:100003'
        }))
        let $t = $('#luckysheet-multiRange-dialog')
                .find('.luckysheet-modal-dialog-content')
                .css('min-width', 300)
                .end(),
            myh = $t.outerHeight(),
            myw = $t.outerWidth()
        let winw = $(window).width(), winh = $(window).height()
        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop()
        $('#luckysheet-multiRange-dialog').css({
            'left': (winw + scrollLeft - myw) / 2,
            'top': (winh + scrollTop - myh) / 3
        }).show()

        selectionCopyShow(_this.getRangeByTxt(value))
    },
    getTxtByRange: function (range) {
        if (range.length > 0) {
            let txt = []

            for (let s = 0; s < range.length; s++) {
                let r1 = range[s].row[0], r2 = range[s].row[1]
                let c1 = range[s].column[0], c2 = range[s].column[1]

                txt.push(getRangetxt(Store.currentSheetIndex, {
                    'row': [r1, r2],
                    'column': [c1, c2]
                }, Store.currentSheetIndex))
            }

            return txt.join(',')
        }
    },
    getRangeByTxt: function (txt) {
        let range = []

        txt = txt.toString()

        if (txt.indexOf(',') != -1) {
            let arr = txt.split(',')
            for (let i = 0; i < arr.length; i++) {
                if (formula.iscelldata(arr[i])) {
                    range.push(formula.getcellrange(arr[i]))
                } else {
                    range = []
                    break
                }
            }
        } else {
            if (formula.iscelldata(txt)) {
                range.push(formula.getcellrange(txt))
            }
        }
        return range
    },
    colorSelectInit: function () {
        const conditionformat_Text = locale().conditionformat

        $('.luckysheet-conditionformat-config-color').spectrum({
            showPalette: true,
            showPaletteOnly: true,
            preferredFormat: 'hex',
            clickoutFiresChange: false,
            showInitial: true,
            showInput: true,
            // flat: true,
            hideAfterPaletteSelect: true,
            showSelectionPalette: true,
            // showButtons: false,//隐藏选择取消按钮
            maxPaletteSize: 8,
            maxSelectionSize: 8,
            // color: currenColor,
            cancelText: conditionformat_Text.cancel,
            chooseText: conditionformat_Text.confirmColor,
            togglePaletteMoreText: 'Customize',
            togglePaletteLessText: 'Put away',
            togglePaletteOnly: true,
            clearText: conditionformat_Text.clearColorSelect,
            noColorSelectedText: 'No color is selected',
            localStorageKey: 'spectrum.textcolor' + server.gridKey,
            palette: [['#000', '#444', '#666', '#999', '#ccc', '#eee', '#f3f3f3', '#fff'],
                ['#f00', '#f90', '#ff0', '#0f0', '#0ff', '#00f', '#90f', '#f0f'],
                ['#f4cccc', '#fce5cd', '#fff2cc', '#d9ead3', '#d0e0e3', '#cfe2f3', '#d9d2e9', '#ead1dc'],
                ['#ea9999', '#f9cb9c', '#ffe599', '#b6d7a8', '#a2c4c9', '#9fc5e8', '#b4a7d6', '#d5a6bd'],
                ['#e06666', '#f6b26b', '#ffd966', '#93c47d', '#76a5af', '#6fa8dc', '#8e7cc3', '#c27ba0'],
                ['#c00', '#e69138', '#f1c232', '#6aa84f', '#45818e', '#3d85c6', '#674ea7', '#a64d79'],
                ['#900', '#b45f06', '#bf9000', '#38761d', '#134f5c', '#0b5394', '#351c75', '#741b47'],
                ['#600', '#783f04', '#7f6000', '#274e13', '#0c343d', '#073763', '#20124d', '#4c1130']],
            change: function (color) {
                if (color != null) {
                    color = color.toHexString()
                }
            }
        })
    },
    conditionformatDialog: function (title, content) {
        let _this = this

        $('#luckysheet-modal-dialog-mask').show()
        $('#luckysheet-conditionformat-dialog').remove()

        const conditionformat_Text = locale().conditionformat

        $('body').append(replaceHtml(modelHTML, {
            'id': 'luckysheet-conditionformat-dialog',
            'addclass': 'luckysheet-conditionformat-dialog',
            'title': title,
            'content': content,
            'botton': `<button id="luckysheet-conditionformat-dialog-confirm" class="btn btn-primary">${conditionformat_Text.confirm}</button>
                        <button class="btn btn-default luckysheet-model-close-btn">${conditionformat_Text.cancel}</button>`,
            'style': 'z-index:9999'
        }))
        let $t = $('#luckysheet-conditionformat-dialog')
                .find('.luckysheet-modal-dialog-content')
                .css('min-width', 300)
                .end(),
            myh = $t.outerHeight(),
            myw = $t.outerWidth()
        let winw = $(window).width(), winh = $(window).height()
        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop()
        $('#luckysheet-conditionformat-dialog').css({
            'left': (winw + scrollLeft - myw) / 2,
            'top': (winh + scrollTop - myh) / 3
        }).show()

        _this.init()
        _this.colorSelectInit()

        if (title == locale().conditionformat.conditionformat_occurrenceDate) {
            _this.daterangeInit('luckysheet-conditionformat-dialog')
        }
    },
    CFiconsDialog: function () {
        $('#luckysheet-modal-dialog-mask').show()
        $('#luckysheet-CFicons-dialog').remove()

        const conditionformat_Text = locale().conditionformat

        let content = `<div class="box">
                            <div style="margin-bottom: 10px;">${conditionformat_Text.pleaseSelectIcon}</div>
                            <div class="title">${conditionformat_Text.direction}</div>
                            <div class="list">
                                <div class="left">
                                    <div class="item" data-len="3" data-leftMin="0" data-top="0" title="${conditionformat_Text.threeWayArrow}(${conditionformat_Text.multicolor})"><div style="background-position:0 0;"></div></div>
                                    <div class="item" data-len="3" data-leftMin="0" data-top="1" title="${conditionformat_Text.threeTriangles}"><div style="background-position:0 -20px;"></div></div>
                                    <div class="item" data-len="4" data-leftMin="0" data-top="2" title="${conditionformat_Text.fourWayArrow}(${conditionformat_Text.multicolor})"><div style="background-position:0 -40px;"></div></div>
                                    <div class="item" data-len="5" data-leftMin="0" data-top="3" title="${conditionformat_Text.fiveWayArrow}(${conditionformat_Text.multicolor})"><div style="background-position:0 -60px;"></div></div>
                                </div>
                                <div class="right">
                                    <div class="item" data-len="3" data-leftMin="5" data-top="0" title="${conditionformat_Text.threeWayArrow}(${conditionformat_Text.grayColor})"><div style="background-position:-131px 0;"></div></div>
                                    <div class="item" data-len="4" data-leftMin="5" data-top="1" title="${conditionformat_Text.fourWayArrow}(${conditionformat_Text.grayColor})"><div style="background-position:-131px -20px;"></div></div>
                                    <div class="item" data-len="5" data-leftMin="5" data-top="2" title="${conditionformat_Text.fiveWayArrow}(${conditionformat_Text.grayColor})"><div style="background-position:-131px -40px;"></div></div>
                                </div>
                                <div style="clear:both;"></div>
                            </div>
                            <div class="title">${conditionformat_Text.shape}</div>
                            <div class="list">
                                <div class="left">
                                    <div class="item" data-len="3" data-leftMin="0" data-top="4" title="${conditionformat_Text.threeColorTrafficLight}(${conditionformat_Text.rimless})"><div style="background-position:0 -80px;"></div></div>
                                    <div class="item" data-len="3" data-leftMin="0" data-top="5" title="${conditionformat_Text.threeSigns}"><div style="background-position:0 -100px;"></div></div>
                                    <div class="item" data-len="4" data-leftMin="0" data-top="6" title="${conditionformat_Text.greenRedBlackGradient}"><div style="background-position:0 -120px;"></div></div>
                                </div>
                                <div class="right">
                                    <div class="item" data-len="3" data-leftMin="5" data-top="4" title="${conditionformat_Text.threeColorTrafficLight}(${conditionformat_Text.bordered})"><div style="background-position:-131px -80px;"></div></div>
                                    <div class="item" data-len="4" data-leftMin="5" data-top="5" title="${conditionformat_Text.fourColorTrafficLight}"><div style="background-position:-131px -100px;"></div></div>
                                </div>
                                <div style="clear:both;"></div>
                            </div>
                            <div class="title">${conditionformat_Text.mark}</div>
                            <div class="list">
                                <div class="left">
                                    <div class="item" data-len="3" data-leftMin="0" data-top="7" title="${conditionformat_Text.threeSymbols}(${conditionformat_Text.circled})"><div style="background-position:0 -140px;"></div></div>
                                    <div class="item" data-len="3" data-leftMin="0" data-top="8" title="${conditionformat_Text.tricolorFlag}"><div style="background-position:0 -160px;"></div></div>
                                </div>
                                <div class="right">
                                    <div class="item" data-len="3" data-leftMin="5" data-top="7" title="${conditionformat_Text.threeSymbols}(${conditionformat_Text.noCircle})"><div style="background-position:-131px -140px;"></div></div>
                                </div>
                                <div style="clear:both;"></div>
                            </div>
                            <div class="title">${conditionformat_Text.grade}</div>
                            <div class="list">
                                <div class="left">
                                    <div class="item" data-len="3" data-leftMin="0" data-top="9" title="${conditionformat_Text.threeStars}"><div style="background-position:0 -180px;"></div></div>
                                    <div class="item" data-len="5" data-leftMin="0" data-top="10" title="${conditionformat_Text.fiveQuadrantDiagram}"><div style="background-position:0 -200px;"></div></div>
                                    <div class="item" data-len="5" data-leftMin="0" data-top="11" title="${conditionformat_Text.fiveBoxes}"><div style="background-position:0 -220px;"></div></div>
                                </div>
                                <div class="right">
                                    <div class="item" data-len="4" data-leftMin="5" data-top="9" title="${conditionformat_Text.grade4}"><div style="background-position:-131px -180px;"></div></div>
                                    <div class="item" data-len="5" data-leftMin="5" data-top="10" title="${conditionformat_Text.grade5}"><div style="background-position:-131px -200px;"></div></div>
                                </div>
                                <div style="clear:both;"></div>
                            </div>
                        </div>`

        $('body').append(replaceHtml(modelHTML, {
            'id': 'luckysheet-CFicons-dialog',
            'addclass': 'luckysheet-CFicons-dialog',
            'title': conditionformat_Text.icons,
            'content': content,
            'botton': `<button class="btn btn-default luckysheet-model-close-btn">${conditionformat_Text.close}</button>`,
            'style': 'z-index:100003'
        }))
        let $t = $('#luckysheet-CFicons-dialog')
                .find('.luckysheet-modal-dialog-content')
                .css('min-width', 400)
                .end(),
            myh = $t.outerHeight(),
            myw = $t.outerWidth()
        let winw = $(window).width(), winh = $(window).height()
        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop()
        $('#luckysheet-CFicons-dialog').css({
            'left': (winw + scrollLeft - myw) / 2,
            'top': (winh + scrollTop - myh) / 3
        }).show()
    },
    administerRuleDialog: function () {
        $('#luckysheet-modal-dialog-mask').show()
        $('#luckysheet-administerRule-dialog').remove()

        const conditionformat_Text = locale().conditionformat

        //工作表
        let opHtml = ''
        for (let j = 0; j < Store.luckysheetfile.length; j++) {
            if (Store.luckysheetfile[j].status == '1') {
                opHtml += `<option value="${escapeHtml(Store.luckysheetfile[j]['index'])}" selected="selected">
                                ${conditionformat_Text.currentSheet}：${escapeHtml(Store.luckysheetfile[j]['name'])}
                            </option>`
            } else {
                opHtml += `<option value="${escapeHtml(Store.luckysheetfile[j]['index'])}">
                                ${conditionformat_Text.sheet}：${escapeHtml(Store.luckysheetfile[j]['name'])}
                            </option>`
            }
        }

        let content = `<div class="chooseSheet">
                            <label>${conditionformat_Text.showRules}：</label>
                            <select>${opHtml}</select>
                        </div>
                        <div class="ruleBox">
                            <div class="ruleBtn">
                                <button id="newConditionRule" class="btn btn-default">${conditionformat_Text.newRule}</button>
                                <button id="editorConditionRule" class="btn btn-default">${conditionformat_Text.editRule}</button>
                                <button id="deleteConditionRule" class="btn btn-default">${conditionformat_Text.deleteRule}</button>
                            </div>
                            <div class="ruleList">
                                <div class="listTitle">
                                    <span>${conditionformat_Text.rule}</span>
                                    <span>${conditionformat_Text.format}</span>
                                    <span>${conditionformat_Text.applyRange}</span>
                                </div>
                                <div class="listBox"></div>
                            </div>
                        </div>`

        $('body').append(replaceHtml(modelHTML, {
            'id': 'luckysheet-administerRule-dialog',
            'addclass': 'luckysheet-administerRule-dialog',
            'title': conditionformat_Text.conditionformatManageRules,
            'content': content,
            'botton': `<button id="luckysheet-administerRule-dialog-confirm" class="btn btn-primary">${conditionformat_Text.confirm}</button>
                        <button id="luckysheet-administerRule-dialog-close" class="btn btn-default">${conditionformat_Text.close}</button>`,
            'style': 'z-index:100003'
        }))
        let $t = $('#luckysheet-administerRule-dialog')
                .find('.luckysheet-modal-dialog-content')
                .css('min-width', 400)
                .end(),
            myh = $t.outerHeight(),
            myw = $t.outerWidth()
        let winw = $(window).width(), winh = $(window).height()
        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop()
        $('#luckysheet-administerRule-dialog').css({
            'left': (winw + scrollLeft - myw) / 2,
            'top': (winh + scrollTop - myh) / 3
        }).show()

        //当前工作表的规则列表
        let index = $('#luckysheet-administerRule-dialog .chooseSheet option:selected').val()
        this.getConditionRuleList(index)
    },
    getConditionRuleList: function (index) {

        let _this = this

        $('#luckysheet-administerRule-dialog .ruleList .listBox').empty()

        let ruleArr = _this.fileClone[getSheetIndex(index)].luckysheet_conditionformat_save //条件格式规则集合
        if (ruleArr != null && ruleArr.length > 0) {
            const conditionformat_Text = locale().conditionformat

            for (let i = 0; i < ruleArr.length; i++) {
                let type = ruleArr[i]['type']            //规则类型
                let format = ruleArr[i]['format']        //规则样式
                let cellrange = ruleArr[i]['cellrange']  //规则应用范围

                let ruleName         //规则名称
                let formatHtml = ''  //样式dom
                if (type == 'dataBar') {
                    ruleName = conditionformat_Text.dataBar

                    formatHtml = '<canvas width="46" height="18" style="width: 46px;height: 18px;margin: 3px 0 0 5px;"></canvas>'
                } else if (type == 'colorGradation') {
                    ruleName = conditionformat_Text.colorGradation

                    formatHtml = '<canvas width="46" height="18" style="width: 46px;height: 18px;margin: 3px 0 0 5px;"></canvas>'
                } else if (type == 'icons') {
                    ruleName = conditionformat_Text.icons

                    formatHtml = '<canvas width="46" height="18" style="width: 46px;height: 18px;margin: 3px 0 0 5px;"></canvas>'
                } else {
                    ruleName = _this.getConditionRuleName(ruleArr[i].conditionName, ruleArr[i].conditionRange, ruleArr[i].conditionValue)

                    if (format['textColor'] != null) {
                        formatHtml += '<span class="colorbox" title="' + conditionformat_Text.textColor + '" style="background-color:' + escapeHtml(format['textColor']) + '"></span>'
                    }

                    if (format['cellColor'] != null) {
                        formatHtml += '<span class="colorbox" title="' + conditionformat_Text.cellColor + '" style="background-color:' + escapeHtml(format['cellColor']) + '"></span>'
                    }
                }

                //应用范围dom
                let rangeTxtArr = []
                for (let s = 0; s < cellrange.length; s++) {
                    let r1 = cellrange[s].row[0], r2 = cellrange[s].row[1]
                    let c1 = cellrange[s].column[0], c2 = cellrange[s].column[1]

                    rangeTxtArr.push(chatatABC(c1) + (r1 + 1) + ':' + chatatABC(c2) + (r2 + 1))
                }

                //条件格式规则列表dom
                let itemHtml = '<div class="item" data-item="' + i + '">' +
                    '<div class="ruleName" title="' + escapeHtml(ruleName) + '">' + escapeHtml(ruleName) + '</div>' +
                    '<div class="format">' + formatHtml + '</div>' +
                    '<div class="ruleRange">' +
                    '<input class="formulaInputFocus" readonly="true" value="' + escapeHtml(rangeTxtArr.join(',')) + '"/>' +
                    '<i class="fa fa-table" aria-hidden="true" title="' + conditionformat_Text.selectRange + '"></i>' +
                    '</div>' +
                    '</div>'

                $('#luckysheet-administerRule-dialog .ruleList .listBox').prepend(itemHtml)
            }

            $('#luckysheet-administerRule-dialog .ruleList .listBox .item canvas').each(function (i) {
                let x = $(this).closest('.item').attr('data-item')

                let type = ruleArr[x]['type']
                let format = ruleArr[x]['format']

                let can = $(this).get(0).getContext('2d')
                if (type == 'dataBar') {
                    if (format.length == 2) {
                        let my_gradient = can.createLinearGradient(0, 0, 46, 0)
                        my_gradient.addColorStop(0, format[0])
                        my_gradient.addColorStop(1, format[1])
                        can.fillStyle = my_gradient
                        can.fillRect(0, 0, 46, 18)

                        can.beginPath()
                        can.moveTo(0, 0)
                        can.lineTo(0, 18)
                        can.lineTo(46, 18)
                        can.lineTo(46, 0)
                        can.lineTo(0, 0)
                        can.lineWidth = Store.devicePixelRatio
                        can.strokeStyle = format[0]
                        can.stroke()
                        can.closePath()
                    } else if (format.length == 1) {
                        can.fillStyle = format[0]
                        can.fillRect(0, 0, 46, 18)

                        can.beginPath()
                        can.moveTo(0, 0)
                        can.lineTo(0, 18)
                        can.lineTo(46, 18)
                        can.lineTo(46, 0)
                        can.lineTo(0, 0)
                        can.lineWidth = Store.devicePixelRatio
                        can.strokeStyle = format[0]
                        can.stroke()
                        can.closePath()
                    }
                } else if (type == 'colorGradation') {
                    let my_gradient = can.createLinearGradient(0, 0, 46, 0)

                    if (format.length == 3) {
                        my_gradient.addColorStop(0, format[0])
                        my_gradient.addColorStop(0.5, format[1])
                        my_gradient.addColorStop(1, format[2])
                    } else if (format.length == 2) {
                        my_gradient.addColorStop(0, format[0])
                        my_gradient.addColorStop(1, format[1])
                    }

                    can.fillStyle = my_gradient
                    can.fillRect(0, 0, 46, 18)
                } else if (type == 'icons') {
                    let len = format['len']
                    let l = format['leftMin']
                    let t = format['top']

                    let w1 = 32 * len + 10 * (len - 1)
                    let h1 = 32
                    let w2 = 46
                    let h2 = 46 * 32 / w1

                    if (l == '0') {
                        can.drawImage(luckysheet_CFiconsImg, 0, t * 32, w1, h1, 0, (18 - h2) / 2, w2, h2)
                    } else if (l == '5') {
                        can.drawImage(luckysheet_CFiconsImg, 210, t * 32, w1, h1, 0, (18 - h2) / 2, w2, h2)
                    }
                }
            })

            $('#luckysheet-administerRule-dialog .ruleList .listBox .item').eq(0).addClass('on')
        }
    },
    getConditionRuleName: function (conditionName, conditionRange, conditionValue) {
        //v 有条件单元格取条件单元格，若无取条件值
        let v
        if (conditionRange[0] != null) {
            v = chatatABC(conditionRange[0]['column'][0]) + (conditionRange[0]['row'][0] + 1)
        } else {
            v = conditionValue[0]
        }

        const conditionformat_Text = locale().conditionformat

        //返回条件格式规则名称
        if (conditionName == 'greaterThan') {
            return conditionformat_Text.cellValue + ' > ' + v
        } else if (conditionName == 'lessThan') {
            return conditionformat_Text.cellValue + ' < ' + v
        } else if (conditionName == 'betweenness') {
            let v2
            if (conditionRange[1] != null) {
                v2 = chatatABC(conditionRange[1]['column'][0]) + (conditionRange[1]['row'][0] + 1)
            } else {
                v2 = conditionValue[1]
            }
            return conditionformat_Text.cellValue + ' ' + conditionformat_Text.between + ' ' + v + ' ' + conditionformat_Text.in + ' ' + v2 + ' ' + conditionformat_Text.between2
        } else if (conditionName == 'equal') {
            return conditionformat_Text.cellValue + ' = ' + v
        } else if (conditionName == 'textContains') {
            return conditionformat_Text.cellValue + conditionformat_Text.contain + ' =' + v
        } else if (conditionName == 'occurrenceDate') {
            return conditionValue
        } else if (conditionName == 'duplicateValue') {
            if (conditionValue == '0') {
                return conditionformat_Text.duplicateValue
            }
            if (conditionValue == '1') {
                return conditionformat_Text.uniqueValue
            }
        } else if (conditionName == 'top10') {
            return conditionformat_Text.top + ' ' + v + ' ' + conditionformat_Text.oneself
        } else if (conditionName == 'top10%') {
            return conditionformat_Text.top + ' ' + v + '% ' + conditionformat_Text.oneself
        } else if (conditionName == 'last10') {
            return conditionformat_Text.last + ' ' + v + ' ' + conditionformat_Text.oneself
        } else if (conditionName == 'last10%') {
            return conditionformat_Text.last + ' ' + v + '% ' + conditionformat_Text.oneself
        } else if (conditionName == 'AboveAverage') {
            return conditionformat_Text.aboveAverage
        } else if (conditionName == 'SubAverage') {
            return conditionformat_Text.belowAverage
        } else if (conditionName == 'formula') {
            if (v.slice(0, 1) != '=') {
                v = '=' + v
            }

            return conditionformat_Text.formula + ': ' + v
        }
    },
    newConditionRuleDialog: function (source) {
        let _this = this

        const conditionformat_Text = locale().conditionformat

        //规则说明
        let ruleExplainHtml = _this.getRuleExplain(0)

        //弹出层
        $('#luckysheet-modal-dialog-mask').show()
        $('#luckysheet-administerRule-dialog').hide()
        $('#luckysheet-newConditionRule-dialog').remove()

        let content = '<div>' +
            '<div class="boxTitle">' + conditionformat_Text.chooseRuleType + '：</div>' +
            _this.ruleTypeHtml() +
            '<div class="boxTitle">' + conditionformat_Text.editRuleDescription + '：</div>' +
            '<div class="ruleExplainBox">' +
            ruleExplainHtml +
            '</div>' +
            '</div>'

        $('body').append(replaceHtml(modelHTML, {
            'id': 'luckysheet-newConditionRule-dialog',
            'addclass': 'luckysheet-newEditorRule-dialog',
            'title': conditionformat_Text.newFormatRule,
            'content': content,
            'botton': `<button id="luckysheet-newConditionRule-dialog-confirm" class="btn btn-primary" data-source="${escapeHtml(source)}">${conditionformat_Text.confirm}</button>
                        <button id="luckysheet-newConditionRule-dialog-close" class="btn btn-default" data-source="${escapeHtml(source)}">${conditionformat_Text.cancel}</button>`,
            'style': 'z-index:100003'
        }))
        let $t = $('#luckysheet-newConditionRule-dialog')
                .find('.luckysheet-modal-dialog-content')
                .css('min-width', 400)
                .end(),
            myh = $t.outerHeight(),
            myw = $t.outerWidth()
        let winw = $(window).width(), winh = $(window).height()
        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop()
        $('#luckysheet-newConditionRule-dialog').css({
            'left': (winw + scrollLeft - myw) / 2,
            'top': (winh + scrollTop - myh) / 3
        }).show()

        //index的规则类型focus
        $('#luckysheet-newConditionRule-dialog .ruleTypeBox .ruleTypeItem:eq(0)').addClass('on').siblings().removeClass('on')

        _this.colorSelectInit()
    },
    editorConditionRuleDialog: function () {
        let _this = this

        const conditionformat_Text = locale().conditionformat

        let rule = _this.editorRule.data

        if (rule == null) {
            return
        }

        let ruleType = rule['type'],
            ruleFormat = rule['format'],
            conditionName = rule['conditionName']

        let index, type1
        if (ruleType == 'dataBar' || ruleType == 'colorGradation' || ruleType == 'icons') {
            index = 0
            type1 = ruleType
        } else {
            if (conditionName == 'greaterThan' || conditionName == 'lessThan' || conditionName == 'betweenness' || conditionName == 'equal' || conditionName == 'textContains' || conditionName == 'occurrenceDate') {
                index = 1

                if (conditionName == 'greaterThan' || conditionName == 'lessThan' || conditionName == 'betweenness' || conditionName == 'equal') {
                    type1 = 'number'
                } else if (conditionName == 'textContains') {
                    type1 = 'text'
                } else if (conditionName == 'occurrenceDate') {
                    type1 = 'date'
                }
            } else if (conditionName == 'top10' || conditionName == 'top10%' || conditionName == 'last10' || conditionName == 'last10%') {
                index = 2

                if (conditionName == 'top10' || conditionName == 'top10%') {
                    type1 = 'top'
                } else if (conditionName == 'last10' || conditionName == 'last10%') {
                    type1 = 'last'
                }
            } else if (conditionName == 'AboveAverage' || conditionName == 'SubAverage') {
                index = 3
                type1 = conditionName
            } else if (conditionName == 'duplicateValue') {
                index = 4
                type1 = rule['conditionValue']
            } else if (conditionName == 'formula') {
                index = 5
            }
        }

        //规则说明
        let ruleExplainHtml = _this.getRuleExplain(index)

        //弹出层
        $('#luckysheet-modal-dialog-mask').show()
        $('#luckysheet-administerRule-dialog').hide()
        $('#luckysheet-editorConditionRule-dialog').remove()

        let content = '<div>' +
            '<div class="boxTitle">' + conditionformat_Text.chooseRuleType + '：</div>' +
            _this.ruleTypeHtml() +
            '<div class="boxTitle">' + conditionformat_Text.editRuleDescription + '：</div>' +
            '<div class="ruleExplainBox">' +
            ruleExplainHtml +
            '</div>' +
            '</div>'

        $('body').append(replaceHtml(modelHTML, {
            'id': 'luckysheet-editorConditionRule-dialog',
            'addclass': 'luckysheet-newEditorRule-dialog',
            'title': conditionformat_Text.editFormatRule,
            'content': content,
            'botton': `<button id="luckysheet-editorConditionRule-dialog-confirm" class="btn btn-primary">${conditionformat_Text.confirm}</button>
                        <button id="luckysheet-editorConditionRule-dialog-close" class="btn btn-default">${conditionformat_Text.cancel}</button>`,
            'style': 'z-index:100003'
        }))
        let $t = $('#luckysheet-editorConditionRule-dialog')
                .find('.luckysheet-modal-dialog-content')
                .css('min-width', 400)
                .end(),
            myh = $t.outerHeight(),
            myw = $t.outerWidth()
        let winw = $(window).width(), winh = $(window).height()
        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop()
        $('#luckysheet-editorConditionRule-dialog').css({
            'left': (winw + scrollLeft - myw) / 2,
            'top': (winh + scrollTop - myh) / 3
        }).show()

        _this.colorSelectInit()

        //规则类型focus
        $('#luckysheet-editorConditionRule-dialog .ruleTypeBox .ruleTypeItem:eq(' + index + ')').addClass('on').siblings().removeClass('on')

        //type1
        $('#luckysheet-editorConditionRule-dialog #type1').val(type1)
        if (type1 == 'dataBar' || type1 == 'colorGradation' || type1 == 'icons' || type1 == 'number' || type1 == 'text' || type1 == 'date') {
            $('#luckysheet-editorConditionRule-dialog .' + type1 + 'Box').show()
            $('#luckysheet-editorConditionRule-dialog .' + type1 + 'Box').siblings().hide()
        }

        if (type1 == 'date') {
            _this.daterangeInit('luckysheet-editorConditionRule-dialog')
        }

        //type2  format  value
        if (ruleType == 'dataBar' || ruleType == 'colorGradation' || ruleType == 'icons') {
            if (type1 == 'dataBar') {
                if (ruleFormat.length == 2) {
                    $('#luckysheet-editorConditionRule-dialog .dataBarBox #type2').val('gradient')
                } else if (ruleFormat.length == 1) {
                    $('#luckysheet-editorConditionRule-dialog .dataBarBox #type2').val('solid')
                }

                $('#luckysheet-editorConditionRule-dialog .dataBarBox .luckysheet-conditionformat-config-color').spectrum('set', ruleFormat[0])
            } else if (type1 == 'colorGradation') {
                if (ruleFormat.length == 3) {
                    $('#luckysheet-editorConditionRule-dialog .colorGradationBox #type2').val('threeColor')

                    $('#luckysheet-editorConditionRule-dialog .colorGradationBox .midVal').show()

                    $('#luckysheet-editorConditionRule-dialog .colorGradationBox .maxVal .luckysheet-conditionformat-config-color').spectrum('set', ruleFormat[0])
                    $('#luckysheet-editorConditionRule-dialog .colorGradationBox .midVal .luckysheet-conditionformat-config-color').spectrum('set', ruleFormat[1])
                    $('#luckysheet-editorConditionRule-dialog .colorGradationBox .minVal .luckysheet-conditionformat-config-color').spectrum('set', ruleFormat[2])
                } else if (ruleFormat.length == 2) {
                    $('#luckysheet-editorConditionRule-dialog .colorGradationBox #type2').val('twoColor')

                    $('#luckysheet-editorConditionRule-dialog .colorGradationBox .midVal').hide()

                    $('#luckysheet-editorConditionRule-dialog .colorGradationBox .maxVal .luckysheet-conditionformat-config-color').spectrum('set', ruleFormat[0])
                    $('#luckysheet-editorConditionRule-dialog .colorGradationBox .minVal .luckysheet-conditionformat-config-color').spectrum('set', ruleFormat[1])
                }
            } else if (type1 == 'icons') {
                let len = ruleFormat['len']
                let l = ruleFormat['leftMin']
                let t = ruleFormat['top']

                $('#luckysheet-editorConditionRule-dialog .iconsBox li').each(function (i, e) {
                    if ($(e).find('div').attr('data-len') == len && $(e).find('div').attr('data-leftmin') == l && $(e).find('div').attr('data-top') == t) {
                        $('#luckysheet-editorConditionRule-dialog .iconsBox .showbox .model').css('background-position', $(e).find('div').css('background-position'))
                        $('#luckysheet-editorConditionRule-dialog .iconsBox .showbox .model').attr('data-len', $(e).find('div').attr('data-len'))
                        $('#luckysheet-editorConditionRule-dialog .iconsBox .showbox .model').attr('data-leftmin', $(e).find('div').attr('data-leftmin'))
                        $('#luckysheet-editorConditionRule-dialog .iconsBox .showbox .model').attr('data-top', $(e).find('div').attr('data-leftmin'))
                        $('#luckysheet-editorConditionRule-dialog .iconsBox .showbox .model').attr('title', $(e).find('div').attr('title'))

                        return true
                    }
                })
            }
        } else {
            if (type1 == 'number') {
                $('#luckysheet-editorConditionRule-dialog .numberBox #type2').val(conditionName)

                let val1
                if (rule.conditionRange[0] != null) {
                    val1 = getRangetxt(Store.currentSheetIndex, {
                        'row': rule.conditionRange[0]['row'],
                        'column': rule.conditionRange[0]['column']
                    }, Store.currentSheetIndex)
                } else {
                    val1 = rule.conditionValue[0]
                }

                $('#luckysheet-editorConditionRule-dialog .numberBox #conditionVal input').val(val1)

                if (conditionName == 'betweenness') {
                    $('#luckysheet-editorConditionRule-dialog .numberBox .txt').show()
                    $('#luckysheet-editorConditionRule-dialog .numberBox #conditionVal2').show()

                    let val2
                    if (rule.conditionRange[1] != null) {
                        val2 = getRangetxt(Store.currentSheetIndex, {
                            'row': rule.conditionRange[1]['row'],
                            'column': rule.conditionRange[1]['column']
                        }, Store.currentSheetIndex)
                    } else {
                        val2 = rule.conditionValue[1]
                    }

                    $('#luckysheet-editorConditionRule-dialog .numberBox #conditionVal2 input').val(val2)
                } else {
                    $('#luckysheet-editorConditionRule-dialog .numberBox .txt').hide()
                    $('#luckysheet-editorConditionRule-dialog .numberBox #conditionVal2').hide()
                }
            } else if (type1 == 'text') {
                let val1
                if (rule.conditionRange[0] != null) {
                    val1 = getRangetxt(Store.currentSheetIndex, {
                        'row': rule.conditionRange[0]['row'],
                        'column': rule.conditionRange[0]['column']
                    }, Store.currentSheetIndex)
                } else {
                    val1 = rule.conditionValue[0]
                }

                $('#luckysheet-editorConditionRule-dialog .textBox #conditionVal input').val(val1)
            } else if (type1 == 'date') {
                _this.daterangeInit('luckysheet-editorConditionRule-dialog')

                let val1 = rule.conditionValue[0]
                $('#luckysheet-editorConditionRule-dialog .dateBox #daterange-btn').val(val1)
            } else if (type1 == 'top' || type1 == 'last') {
                let val1 = rule.conditionValue[0]

                if (conditionName == 'top10%' || conditionName == 'last10%') {
                    $('#luckysheet-editorConditionRule-dialog #isPercent').attr('checked', 'checked')
                }
            } else {
                if (conditionName == 'formula') {
                    let val1 = rule.conditionValue[0]
                    $('#luckysheet-editorConditionRule-dialog #formulaConditionVal input').val(val1)
                }
            }

            $('#luckysheet-editorConditionRule-dialog #textcolorshow').spectrum('set', ruleFormat.textColor)
            $('#luckysheet-editorConditionRule-dialog #cellcolorshow').spectrum('set', ruleFormat.cellColor)
        }
    },
    infoDialog: function (title, content) {
        $('#luckysheet-modal-dialog-mask').show()
        $('#luckysheet-conditionformat-info-dialog').remove()
        $('body').append(replaceHtml(modelHTML, {
            'id': 'luckysheet-conditionformat-info-dialog',
            'addclass': '',
            'title': title,
            'content': content,
            'botton': `<button id="luckysheet-conditionformat-info-dialog-close" class="btn btn-default">${locale().conditionformat.close}</button>`,
            'style': 'z-index:100003'
        }))
        let $t = $('#luckysheet-conditionformat-info-dialog')
                .find('.luckysheet-modal-dialog-content')
                .css('min-width', 300)
                .end(),
            myh = $t.outerHeight(),
            myw = $t.outerWidth()
        let winw = $(window).width(), winh = $(window).height()
        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop()
        $('#luckysheet-conditionformat-info-dialog').css({
            'left': (winw + scrollLeft - myw) / 2,
            'top': (winh + scrollTop - myh) / 3
        }).show()
    },
    getRuleExplain: function (index) {
        const conditionformat_Text = locale().conditionformat

        let textCellColorHtml = this.textCellColorHtml()

        let ruleExplainHtml
        switch (index) {
            case 0: //基于各自值设置所有单元格的格式
                ruleExplainHtml = `<div class="title">${conditionformat_Text.ruleTypeItem1}：</div>
                                    <div style="height: 30px;margin-bottom: 5px;">
                                        <label style="display: block;width: 80px;height: 30px;line-height: 30px;float: left;">${conditionformat_Text.formatStyle}：</label>
                                        <select id="type1">
                                            <option value="dataBar">${conditionformat_Text.dataBar}</option>
                                            <option value="colorGradation">${conditionformat_Text.colorGradation}</option>
                                            <option value="icons">${conditionformat_Text.icons}</option>
                                        </select>
                                    </div>
                                    <div>
                                        <div class="type1Box dataBarBox">
                                            <div style="height: 30px;margin-bottom: 5px;">
                                                <label style="display: block;width: 80px;height: 30px;line-height: 30px;float: left;">${conditionformat_Text.fillType}：</label>
                                                <select id="type2">
                                                    <option value="gradient">${conditionformat_Text.gradient}</option>
                                                    <option value="solid">${conditionformat_Text.solid}</option>
                                                </select>
                                            </div>
                                            <div style="height: 30px;margin-bottom: 5px;">
                                                <label style="display: block;width: 80px;height: 30px;line-height: 30px;float: left;">${conditionformat_Text.color}：</label>
                                                <input data-tips="${conditionformat_Text.dataBarColor}" data-func="background" class="luckysheet-conditionformat-config-color" type="text" value="#638ec6" style="display: none;">
                                            </div>
                                        </div>
                                        <div class="type1Box colorGradationBox" style="display: none;">
                                            <div style="height: 30px;margin-bottom: 5px;">
                                                <label style="display: block;width: 80px;height: 30px;line-height: 30px;float: left;">${conditionformat_Text.fillType}：</label>
                                                <select id="type2">
                                                    <option value="threeColor">${conditionformat_Text.tricolor}</option>
                                                    <option value="twoColor">${conditionformat_Text.twocolor}</option>
                                                </select>
                                            </div>
                                            <div class="maxVal" style="height: 30px;margin-bottom: 5px;">
                                                <label style="display: block;width: 80px;height: 30px;line-height: 30px;float: left;">${conditionformat_Text.maxValue}：</label>
                                                <input data-tips="${conditionformat_Text.maxValue} ${conditionformat_Text.color}" data-func="background" class="luckysheet-conditionformat-config-color" type="text" value="rgb(99, 190, 123)" style="display: none;">
                                            </div>
                                            <div class="midVal" style="height: 30px;margin-bottom: 5px;">
                                                <label style="display: block;width: 80px;height: 30px;line-height: 30px;float: left;">${conditionformat_Text.medianValue}：</label>
                                                <input data-tips="${conditionformat_Text.medianValue} ${conditionformat_Text.color}" data-func="background" class="luckysheet-conditionformat-config-color" type="text" value="rgb(255, 235, 132)" style="display: none;">
                                            </div>
                                            <div class="minVal" style="height: 30px;margin-bottom: 5px;">
                                                <label style="display: block;width: 80px;height: 30px;line-height: 30px;float: left;">${conditionformat_Text.minValue}：</label>
                                                <input data-tips="${conditionformat_Text.minValue} ${conditionformat_Text.color}" data-func="background" class="luckysheet-conditionformat-config-color" type="text" value="rgb(248, 105, 107)" style="display: none;">
                                            </div>
                                        </div>
                                        <div class="type1Box iconsBox" style="display: none;">
                                            <label>${conditionformat_Text.fillType}：</label>
                                            <div class="showbox">
                                                <div class="model" data-len="3" data-leftmin="0" data-top="0" title="${conditionformat_Text.threeWayArrow}(${conditionformat_Text.multicolor})" style="background-position: 0 0;"></div>
                                                <span class="ui-selectmenu-icon ui-icon ui-icon-triangle-1-s" style="margin-top: 2px;"></span>
                                            </div>
                                            <ul>
                                                <li><div data-len="3" data-leftmin="0" data-top="0" title="${conditionformat_Text.threeWayArrow}(${conditionformat_Text.multicolor})" style="background-position: 0 0;"></div></li>
                                                <li><div data-len="3" data-leftmin="5" data-top="0" title="${conditionformat_Text.threeWayArrow}(${conditionformat_Text.grayColor})" style="background-position: -131px 0;"></div></li>
                                                <li><div data-len="3" data-leftmin="0" data-top="1" title="${conditionformat_Text.threeTriangles}" style="background-position: 0 -20px;"></div></li>
                                                <li><div data-len="4" data-leftmin="0" data-top="2" title="${conditionformat_Text.fourWayArrow}(${conditionformat_Text.multicolor})" style="background-position: 0 -40px;"></div></li>
                                                <li><div data-len="4" data-leftmin="5" data-top="1" title="${conditionformat_Text.fourWayArrow}(${conditionformat_Text.grayColor})" style="background-position: -131px -20px;"></div></li>
                                                <li><div data-len="5" data-leftmin="0" data-top="3" title="${conditionformat_Text.fiveWayArrow}(${conditionformat_Text.multicolor})" style="background-position: 0 -60px;"></div></li>
                                                <li><div data-len="5" data-leftmin="5" data-top="2" title="${conditionformat_Text.fiveWayArrow}(${conditionformat_Text.grayColor})" style="background-position: -131px -40px;"></div></li>
                                                <li><div data-len="3" data-leftmin="0" data-top="4" title="${conditionformat_Text.threeColorTrafficLight}(${conditionformat_Text.rimless})" style="background-position: 0 -80px;"></div></li>
                                                <li><div data-len="3" data-leftmin="5" data-top="4" title="${conditionformat_Text.threeColorTrafficLight}(${conditionformat_Text.bordered})" style="background-position: -131px -80px;"></div></li>
                                                <li><div data-len="3" data-leftmin="0" data-top="5" title="${conditionformat_Text.threeSigns}" style="background-position: 0 -100px;"></div></li>
                                                <li><div data-len="4" data-leftmin="5" data-top="5" title="${conditionformat_Text.fourColorTrafficLight}" style="background-position: -131px -100px;"></div></li>
                                                <li><div data-len="4" data-leftmin="0" data-top="6" title="${conditionformat_Text.greenRedBlackGradient}" style="background-position: 0 -120px;"></div></li>
                                                <li><div data-len="3" data-leftmin="0" data-top="7" title="${conditionformat_Text.threeSymbols}(${conditionformat_Text.circled})" style="background-position: 0 -140px;"></div></li>
                                                <li><div data-len="3" data-leftmin="5" data-top="7" title="${conditionformat_Text.threeSymbols}(${conditionformat_Text.noCircle})" style="background-position: -131px -140px;"></div></li>
                                                <li><div data-len="3" data-leftmin="0" data-top="8" title="${conditionformat_Text.tricolorFlag}" style="background-position: 0 -160px;"></div></li>
                                                <li><div data-len="3" data-leftmin="0" data-top="9" title="${conditionformat_Text.threeStars}" style="background-position: 0 -180px;"></div></li>
                                                <li><div data-len="5" data-leftmin="0" data-top="10" title="${conditionformat_Text.fiveQuadrantDiagram}" style="background-position: 0 -200px;"></div></li>
                                                <li><div data-len="5" data-leftmin="0" data-top="11" title="${conditionformat_Text.fiveBoxes}" style="background-position: 0 -220px;"></div></li>
                                                <li><div data-len="4" data-leftmin="5" data-top="9" title="${conditionformat_Text.grade4}" style="background-position: -131px -180px;"></div></li>
                                                <li><div data-len="5" data-leftmin="5" data-top="10" title="${conditionformat_Text.grade5}" style="background-position: -131px -200px;"></div></li>
                                            </ul>
                                        </div>
                                    </div>`
                break
            case 1: //只为包含以下内容的单元格设置格式
                ruleExplainHtml = `<div class="title">${conditionformat_Text.ruleTypeItem2_title}：</div>
                                    <div style="height: 30px;margin-bottom: 10px;">
                                        <select id="type1">
                                            <option value="number">${conditionformat_Text.cellValue}</option>
                                            <option value="text">${conditionformat_Text.specificText}</option>
                                            <option value="date">${conditionformat_Text.occurrence}</option>
                                        </select>
                                        <div>
                                            <div class="type1Box numberBox">
                                                <select id="type2">
                                                    <option value="greaterThan">${conditionformat_Text.greaterThan}</option>
                                                    <option value="lessThan">${conditionformat_Text.lessThan}</option>
                                                    <option value="betweenness">${conditionformat_Text.between}</option>
                                                    <option value="equal">${conditionformat_Text.equal}</option>
                                                </select>
                                                <div class="inpbox range" id="conditionVal">
                                                    <input class="formulaInputFocus"/>
                                                    <i class="fa fa-table" aria-hidden="true" title="${conditionformat_Text.selectCell}"></i>
                                                </div>
                                                <span class="txt" style="display: none;">${conditionformat_Text.in}</span>
                                                <div class="inpbox range" id="conditionVal2" style="display: none;">
                                                    <input class="formulaInputFocus"/>
                                                    <i class="fa fa-table" aria-hidden="true" title="${conditionformat_Text.selectDataRange}"></i>
                                                </div>
                                            </div>
                                            <div class="type1Box textBox" style="display: none;">
                                                <select id="type2">
                                                    <option value="">${conditionformat_Text.contain}</option>
                                                </select>
                                                <div class="inpbox range" id="conditionVal">
                                                    <input class="formulaInputFocus"/>
                                                    <i class="fa fa-table" aria-hidden="true" title="${conditionformat_Text.selectCell}"></i>
                                                </div>
                                            </div>
                                            <div class="type1Box dateBox" style="display: none;">
                                                <div style="width: 162px;" class="inpbox">
                                                    <input style="width: 150px;" id="daterange-btn" readonly="readonly" placeholder="${conditionformat_Text.pleaseSelectADate}"/>
                                                </div>
                                            </div>
                                        </div>
                                    </div>
                                    <div class="title">${conditionformat_Text.setFormat}: </div>${textCellColorHtml}`
                break
            case 2: //仅对排名靠前或靠后的数值设置格式
                ruleExplainHtml = `<div class="title">${conditionformat_Text.ruleTypeItem3_title}：</div>
                                    <div style="height: 30px;margin-bottom: 10px;">
                                        <select id="type1">
                                            <option value="top">${conditionformat_Text.top}</option>
                                            <option value="last">${conditionformat_Text.last}</option>
                                        </select>
                                        <div class="inpbox" id="conditionVal">
                                            <input class="formulaInputFocus" type="number" value="10"/>
                                        </div>
                                        <input id="isPercent" type="checkbox"/>
                                        <label for="isPercent" class="txt">${conditionformat_Text.selectRange_percent}</label>
                                    </div>
                                    <div class="title">${conditionformat_Text.setFormat}：</div>${textCellColorHtml}`
                break
            case 3: //仅对高于或低于平均值的数值设置格式
                ruleExplainHtml = `<div class="title">${conditionformat_Text.ruleTypeItem4_title}：</div>
                                    <div style="height: 30px;margin-bottom: 10px;">
                                        <select id="type1">
                                            <option value="AboveAverage">${conditionformat_Text.above}</option>
                                            <option value="SubAverage">${conditionformat_Text.below}</option>
                                        </select>
                                        <span class="txt">${conditionformat_Text.selectRange_average}</span>
                                    </div>
                                    <div class="title">${conditionformat_Text.setFormat}：</div>${textCellColorHtml}`
                break
            case 4: //仅对唯一值或重复值设置格式
                ruleExplainHtml = `<div class="title">${conditionformat_Text.all}：</div>
                                    <div style="height: 30px;margin-bottom: 10px;">
                                        <select id="type1">
                                            <option value="0">${conditionformat_Text.duplicateValue}</option>
                                            <option value="1">${conditionformat_Text.uniqueValue}</option>
                                        </select>
                                        <span class="txt">${conditionformat_Text.selectRange_value}</span>
                                    </div>
                                    <div class="title">${conditionformat_Text.setFormat}：</div>${textCellColorHtml}`
                break
            case 5: //使用公式确定要设置格式的单元格
                ruleExplainHtml = `<div class="title">${conditionformat_Text.ruleTypeItem2_title}：</div>
                                    <div style="height: 30px;margin-bottom: 10px;">
                                        <div class="inpbox range" id="formulaConditionVal" style="width: 250px;">
                                            <input class="formulaInputFocus" style="width: 200px;"/>
                                            <i class="fa fa-table" aria-hidden="true" title="${conditionformat_Text.selectCell}"></i>
                                        </div>
                                    </div>
                                    <div class="title">${conditionformat_Text.setFormat}: </div>${textCellColorHtml}`
                break
        }

        return ruleExplainHtml
    },
    daterangeInit: function (id) {
        const conditionformat_Text = locale().conditionformat

        //日期选择插件
        $('.ranges_1 ul').remove()
        $('#' + id).find('#daterange-btn').flatpickr({
            mode: 'range',
            onChange: function (data, label) {
                const [start, end] = data
                //label:通过它来知道用户选择的是什么，传给后台进行相应的展示
                let format1 = [
                    conditionformat_Text.yesterday,
                    conditionformat_Text.today
                ]

                let format2 = [
                    conditionformat_Text.lastWeek,
                    conditionformat_Text.thisWeek,
                    conditionformat_Text.lastMonth,
                    conditionformat_Text.thisMonth,
                    conditionformat_Text.lastYear,
                    conditionformat_Text.thisYear,
                    conditionformat_Text.last7days,
                    conditionformat_Text.last30days
                ]

                if (label == conditionformat_Text.all) {
                    $('#daterange-btn').val('')
                } else if (format1.indexOf(label) > -1) {
                    $('#daterange-btn').val(dayjs(start).format('YYYY/MM/DD'))
                } else if (format2.indexOf(label) > -1) {
                    $('#daterange-btn').val(dayjs(start).format('YYYY/MM/DD') + '-' + dayjs(end).format('YYYY/MM/DD'))
                }
            }
        })
    },
    CFSplitRange: function (range1, range2, range3, type) {
        let range = []

        let offset_r = range3['row'][0] - range2['row'][0]
        let offset_c = range3['column'][0] - range2['column'][0]

        let r1 = range1['row'][0], r2 = range1['row'][1]
        let c1 = range1['column'][0], c2 = range1['column'][1]

        if (r1 >= range2['row'][0] && r2 <= range2['row'][1] && c1 >= range2['column'][0] && c2 <= range2['column'][1]) {
            //选区 包含 条件格式应用范围 全部

            if (type == 'allPart') { //所有部分
                range = [
                    {'row': [r1 + offset_r, r2 + offset_r], 'column': [c1 + offset_c, c2 + offset_c]}
                ]
            } else if (type == 'restPart') { //剩余部分
                range = []
            } else if (type == 'operatePart') { //操作部分
                range = [
                    {'row': [r1 + offset_r, r2 + offset_r], 'column': [c1 + offset_c, c2 + offset_c]}
                ]
            }
        } else if (r1 >= range2['row'][0] && r1 <= range2['row'][1] && c1 >= range2['column'][0] && c2 <= range2['column'][1]) {
            //选区 行贯穿 条件格式应用范围 上部分

            if (type == 'allPart') { //所有部分
                range = [
                    {'row': [range2['row'][1] + 1, r2], 'column': [c1, c2]},
                    {'row': [r1 + offset_r, range2['row'][1] + offset_r], 'column': [c1 + offset_c, c2 + offset_c]}
                ]
            } else if (type == 'restPart') { //剩余部分
                range = [
                    {'row': [range2['row'][1] + 1, r2], 'column': [c1, c2]}
                ]
            } else if (type == 'operatePart') { //操作部分
                range = [
                    {'row': [r1 + offset_r, range2['row'][1] + offset_r], 'column': [c1 + offset_c, c2 + offset_c]}
                ]
            }
        } else if (r2 >= range2['row'][0] && r2 <= range2['row'][1] && c1 >= range2['column'][0] && c2 <= range2['column'][1]) {
            //选区 行贯穿 条件格式应用范围 下部分

            if (type == 'allPart') { //所有部分
                range = [
                    {'row': [r1, range2['row'][0] - 1], 'column': [c1, c2]},
                    {'row': [range2['row'][0] + offset_r, r2 + offset_r], 'column': [c1 + offset_c, c2 + offset_c]}
                ]
            } else if (type == 'restPart') { //剩余部分
                range = [
                    {'row': [r1, range2['row'][0] - 1], 'column': [c1, c2]}
                ]
            } else if (type == 'operatePart') { //操作部分
                range = [
                    {'row': [range2['row'][0] + offset_r, r2 + offset_r], 'column': [c1 + offset_c, c2 + offset_c]}
                ]
            }
        } else if (r1 < range2['row'][0] && r2 > range2['row'][1] && c1 >= range2['column'][0] && c2 <= range2['column'][1]) {
            //选区 行贯穿 条件格式应用范围 中间部分

            if (type == 'allPart') { //所有部分
                range = [
                    {'row': [r1, range2['row'][0] - 1], 'column': [c1, c2]},
                    {'row': [range2['row'][1] + 1, r2], 'column': [c1, c2]},
                    {
                        'row': [range2['row'][0] + offset_r, range2['row'][1] + offset_r],
                        'column': [c1 + offset_c, c2 + offset_c]
                    }
                ]
            } else if (type == 'restPart') { //剩余部分
                range = [
                    {'row': [r1, range2['row'][0] - 1], 'column': [c1, c2]},
                    {'row': [range2['row'][1] + 1, r2], 'column': [c1, c2]}
                ]
            } else if (type == 'operatePart') { //操作部分
                range = [
                    {
                        'row': [range2['row'][0] + offset_r, range2['row'][1] + offset_r],
                        'column': [c1 + offset_c, c2 + offset_c]
                    }
                ]
            }
        } else if (c1 >= range2['column'][0] && c1 <= range2['column'][1] && r1 >= range2['row'][0] && r2 <= range2['row'][1]) {
            //选区 列贯穿 条件格式应用范围 左部分

            if (type == 'allPart') { //所有部分
                range = [
                    {'row': [r1, r2], 'column': [range2['column'][1] + 1, c2]},
                    {'row': [r1 + offset_r, r2 + offset_r], 'column': [c1 + offset_c, range2['column'][1] + offset_c]}
                ]
            } else if (type == 'restPart') { //剩余部分
                range = [
                    {'row': [r1, r2], 'column': [range2['column'][1] + 1, c2]}
                ]
            } else if (type == 'operatePart') { //操作部分
                range = [
                    {'row': [r1 + offset_r, r2 + offset_r], 'column': [c1 + offset_c, range2['column'][1] + offset_c]}
                ]
            }
        } else if (c2 >= range2['column'][0] && c2 <= range2['column'][1] && r1 >= range2['row'][0] && r2 <= range2['row'][1]) {
            //选区 列贯穿 条件格式应用范围 右部分

            if (type == 'allPart') { //所有部分
                range = [
                    {'row': [r1, r2], 'column': [c1, range2['column'][0] - 1]},
                    {'row': [r1 + offset_r, r2 + offset_r], 'column': [range2['column'][0] + offset_c, c2 + offset_c]}
                ]
            } else if (type == 'restPart') { //剩余部分
                range = [
                    {'row': [r1, r2], 'column': [c1, range2['column'][0] - 1]}
                ]
            } else if (type == 'operatePart') { //操作部分
                range = [
                    {'row': [r1 + offset_r, r2 + offset_r], 'column': [range2['column'][0] + offset_c, c2 + offset_c]}
                ]
            }
        } else if (c1 < range2['column'][0] && c2 > range2['column'][1] && r1 >= range2['row'][0] && r2 <= range2['row'][1]) {
            //选区 列贯穿 条件格式应用范围 中间部分

            if (type == 'allPart') { //所有部分
                range = [
                    {'row': [r1, r2], 'column': [c1, range2['column'][0] - 1]},
                    {'row': [r1, r2], 'column': [range2['column'][1] + 1, c2]},
                    {
                        'row': [r1 + offset_r, r2 + offset_r],
                        'column': [range2['column'][0] + offset_c, range2['column'][1] + offset_c]
                    }
                ]
            } else if (type == 'restPart') { //剩余部分
                range = [
                    {'row': [r1, r2], 'column': [c1, range2['column'][0] - 1]},
                    {'row': [r1, r2], 'column': [range2['column'][1] + 1, c2]}
                ]
            } else if (type == 'operatePart') { //操作部分
                range = [
                    {
                        'row': [r1 + offset_r, r2 + offset_r],
                        'column': [range2['column'][0] + offset_c, range2['column'][1] + offset_c]
                    }
                ]
            }
        } else if (r1 >= range2['row'][0] && r1 <= range2['row'][1] && c1 >= range2['column'][0] && c1 <= range2['column'][1]) {
            //选区 包含 条件格式应用范围 左上角部分

            if (type == 'allPart') { //所有部分
                range = [
                    {'row': [r1, range2['row'][1]], 'column': [range2['column'][1] + 1, c2]},
                    {'row': [range2['row'][1] + 1, r2], 'column': [c1, c2]},
                    {
                        'row': [r1 + offset_r, range2['row'][1] + offset_r],
                        'column': [c1 + offset_c, range2['column'][1] + offset_c]
                    }
                ]
            } else if (type == 'restPart') { //剩余部分
                range = [
                    {'row': [r1, range2['row'][1]], 'column': [range2['column'][1] + 1, c2]},
                    {'row': [range2['row'][1] + 1, r2], 'column': [c1, c2]}
                ]
            } else if (type == 'operatePart') { //操作部分
                range = [
                    {
                        'row': [r1 + offset_r, range2['row'][1] + offset_r],
                        'column': [c1 + offset_c, range2['column'][1] + offset_c]
                    }
                ]
            }
        } else if (r1 >= range2['row'][0] && r1 <= range2['row'][1] && c2 >= range2['column'][0] && c2 <= range2['column'][1]) {
            //选区 包含 条件格式应用范围 右上角部分

            if (type == 'allPart') { //所有部分
                range = [
                    {'row': [r1, range2['row'][1]], 'column': [c1, range2['column'][0] - 1]},
                    {'row': [range2['row'][1] + 1, r2], 'column': [c1, c2]},
                    {
                        'row': [r1 + offset_r, range2['row'][1] + offset_r],
                        'column': [range2['column'][0] + offset_c, c2 + offset_c]
                    }
                ]
            } else if (type == 'restPart') { //剩余部分
                range = [
                    {'row': [r1, range2['row'][1]], 'column': [c1, range2['column'][0] - 1]},
                    {'row': [range2['row'][1] + 1, r2], 'column': [c1, c2]}
                ]
            } else if (type == 'operatePart') { //操作部分
                range = [
                    {
                        'row': [r1 + offset_r, range2['row'][1] + offset_r],
                        'column': [range2['column'][0] + offset_c, c2 + offset_c]
                    }
                ]
            }
        } else if (r2 >= range2['row'][0] && r2 <= range2['row'][1] && c1 >= range2['column'][0] && c1 <= range2['column'][1]) {
            //选区 包含 条件格式应用范围 左下角部分

            if (type == 'allPart') { //所有部分
                range = [
                    {'row': [r1, range2['row'][0] - 1], 'column': [c1, c2]},
                    {'row': [range2['row'][0], r2], 'column': [range2['column'][1] + 1, c2]},
                    {
                        'row': [range2['row'][0] + offset_r, r2 + offset_r],
                        'column': [c1 + offset_c, range2['column'][1] + offset_c]
                    }
                ]
            } else if (type == 'restPart') { //剩余部分
                range = [
                    {'row': [r1, range2['row'][0] - 1], 'column': [c1, c2]},
                    {'row': [range2['row'][0], r2], 'column': [range2['column'][1] + 1, c2]}
                ]
            } else if (type == 'operatePart') { //操作部分
                range = [
                    {
                        'row': [range2['row'][0] + offset_r, r2 + offset_r],
                        'column': [c1 + offset_c, range2['column'][1] + offset_c]
                    }
                ]
            }
        } else if (r2 >= range2['row'][0] && r2 <= range2['row'][1] && c2 >= range2['column'][0] && c2 <= range2['column'][1]) {
            //选区 包含 条件格式应用范围 右下角部分

            if (type == 'allPart') { //所有部分
                range = [
                    {'row': [r1, range2['row'][0] - 1], 'column': [c1, c2]},
                    {'row': [range2['row'][0], r2], 'column': [c1, range2['column'][0] - 1]},
                    {
                        'row': [range2['row'][0] + offset_r, r2 + offset_r],
                        'column': [range2['column'][0] + offset_c, c2 + offset_c]
                    }
                ]
            } else if (type == 'restPart') { //剩余部分
                range = [
                    {'row': [r1, range2['row'][0] - 1], 'column': [c1, c2]},
                    {'row': [range2['row'][0], r2], 'column': [c1, range2['column'][0] - 1]}
                ]
            } else if (type == 'operatePart') { //操作部分
                range = [
                    {
                        'row': [range2['row'][0] + offset_r, r2 + offset_r],
                        'column': [range2['column'][0] + offset_c, c2 + offset_c]
                    }
                ]
            }
        } else if (r1 < range2['row'][0] && r2 > range2['row'][1] && c1 >= range2['column'][0] && c1 <= range2['column'][1]) {
            //选区 包含 条件格式应用范围 左中间部分

            if (type == 'allPart') { //所有部分
                range = [
                    {'row': [r1, range2['row'][0] - 1], 'column': [c1, c2]},
                    {'row': [range2['row'][0], range2['row'][1]], 'column': [range2['column'][1] + 1, c2]},
                    {'row': [range2['row'][1] + 1, r2], 'column': [c1, c2]},
                    {
                        'row': [range2['row'][0] + offset_r, range2['row'][1] + offset_r],
                        'column': [c1 + offset_c, range2['column'][1] + offset_c]
                    }
                ]
            } else if (type == 'restPart') { //剩余部分
                range = [
                    {'row': [r1, range2['row'][0] - 1], 'column': [c1, c2]},
                    {'row': [range2['row'][0], range2['row'][1]], 'column': [range2['column'][1] + 1, c2]},
                    {'row': [range2['row'][1] + 1, r2], 'column': [c1, c2]}
                ]
            } else if (type == 'operatePart') { //操作部分
                range = [
                    {
                        'row': [range2['row'][0] + offset_r, range2['row'][1] + offset_r],
                        'column': [c1 + offset_c, range2['column'][1] + offset_c]
                    }
                ]
            }
        } else if (r1 < range2['row'][0] && r2 > range2['row'][1] && c2 >= range2['column'][0] && c2 <= range2['column'][1]) {
            //选区 包含 条件格式应用范围 右中间部分

            if (type == 'allPart') { //所有部分
                range = [
                    {'row': [r1, range2['row'][0] - 1], 'column': [c1, c2]},
                    {'row': [range2['row'][0], range2['row'][1]], 'column': [c1, range2['column'][0] - 1]},
                    {'row': [range2['row'][1] + 1, r2], 'column': [c1, c2]},
                    {
                        'row': [range2['row'][0] + offset_r, range2['row'][1] + offset_r],
                        'column': [range2['column'][0] + offset_c, c2 + offset_c]
                    }
                ]
            } else if (type == 'restPart') { //剩余部分
                range = [
                    {'row': [r1, range2['row'][0] - 1], 'column': [c1, c2]},
                    {'row': [range2['row'][0], range2['row'][1]], 'column': [c1, range2['column'][0] - 1]},
                    {'row': [range2['row'][1] + 1, r2], 'column': [c1, c2]}
                ]
            } else if (type == 'operatePart') { //操作部分
                range = [
                    {
                        'row': [range2['row'][0] + offset_r, range2['row'][1] + offset_r],
                        'column': [range2['column'][0] + offset_c, c2 + offset_c]
                    }
                ]
            }
        } else if (c1 < range2['column'][0] && c2 > range2['column'][1] && r1 >= range2['row'][0] && r1 <= range2['row'][1]) {
            //选区 包含 条件格式应用范围 上中间部分

            if (type == 'allPart') { //所有部分
                range = [
                    {'row': [r1, range2['row'][1]], 'column': [c1, range2['column'][0] - 1]},
                    {'row': [r1, range2['row'][1]], 'column': [range2['column'][1] + 1, c2]},
                    {'row': [range2['row'][1] + 1, r2], 'column': [c1, c2]},
                    {
                        'row': [r1 + offset_r, range2['row'][1] + offset_r],
                        'column': [range2['column'][0] + offset_c, range2['column'][1] + offset_c]
                    }
                ]
            } else if (type == 'restPart') { //剩余部分
                range = [
                    {'row': [r1, range2['row'][1]], 'column': [c1, range2['column'][0] - 1]},
                    {'row': [r1, range2['row'][1]], 'column': [range2['column'][1] + 1, c2]},
                    {'row': [range2['row'][1] + 1, r2], 'column': [c1, c2]}
                ]
            } else if (type == 'operatePart') { //操作部分
                range = [
                    {
                        'row': [r1 + offset_r, range2['row'][1] + offset_r],
                        'column': [range2['column'][0] + offset_c, range2['column'][1] + offset_c]
                    }
                ]
            }
        } else if (c1 < range2['column'][0] && c2 > range2['column'][1] && r2 >= range2['row'][0] && r2 <= range2['row'][1]) {
            //选区 包含 条件格式应用范围 下中间部分

            if (type == 'allPart') { //所有部分
                range = [
                    {'row': [r1, range2['row'][0] - 1], 'column': [c1, c2]},
                    {'row': [range2['row'][0], r2], 'column': [c1, range2['column'][0] - 1]},
                    {'row': [range2['row'][0], r2], 'column': [range2['column'][1] + 1, c2]},
                    {
                        'row': [range2['row'][0] + offset_r, r2 + offset_r],
                        'column': [range2['column'][0] + offset_c, range2['column'][1] + offset_c]
                    }
                ]
            } else if (type == 'restPart') { //剩余部分
                range = [
                    {'row': [r1, range2['row'][0] - 1], 'column': [c1, c2]},
                    {'row': [range2['row'][0], r2], 'column': [c1, range2['column'][0] - 1]},
                    {'row': [range2['row'][0], r2], 'column': [range2['column'][1] + 1, c2]}
                ]
            } else if (type == 'operatePart') { //操作部分
                range = [
                    {
                        'row': [range2['row'][0] + offset_r, r2 + offset_r],
                        'column': [range2['column'][0] + offset_c, range2['column'][1] + offset_c]
                    }
                ]
            }
        } else if (r1 < range2['row'][0] && r2 > range2['row'][1] && c1 < range2['column'][0] && c2 > range2['column'][1]) {
            //选区 包含 条件格式应用范围 正中间部分

            if (type == 'allPart') { //所有部分
                range = [
                    {'row': [r1, range2['row'][0] - 1], 'column': [c1, c2]},
                    {'row': [range2['row'][0], range2['row'][1]], 'column': [c1, range2['column'][0] - 1]},
                    {'row': [range2['row'][0], range2['row'][1]], 'column': [range2['column'][1] + 1, c2]},
                    {'row': [range2['row'][1] + 1, r2], 'column': [c1, c2]},
                    {
                        'row': [range2['row'][0] + offset_r, range2['row'][1] + offset_r],
                        'column': [range2['column'][0] + offset_c, range2['column'][1] + offset_c]
                    }
                ]
            } else if (type == 'restPart') { //剩余部分
                range = [
                    {'row': [r1, range2['row'][0] - 1], 'column': [c1, c2]},
                    {'row': [range2['row'][0], range2['row'][1]], 'column': [c1, range2['column'][0] - 1]},
                    {'row': [range2['row'][0], range2['row'][1]], 'column': [range2['column'][1] + 1, c2]},
                    {'row': [range2['row'][1] + 1, r2], 'column': [c1, c2]}
                ]
            } else if (type == 'operatePart') { //操作部分
                range = [
                    {
                        'row': [range2['row'][0] + offset_r, range2['row'][1] + offset_r],
                        'column': [range2['column'][0] + offset_c, range2['column'][1] + offset_c]
                    }
                ]
            }
        } else {
            //选区 在 条件格式应用范围 之外

            if (type == 'allPart') { //所有部分
                range = [
                    {'row': [r1, r2], 'column': [c1, c2]}
                ]
            } else if (type == 'restPart') { //剩余部分
                range = [
                    {'row': [r1, r2], 'column': [c1, c2]}
                ]
            } else if (type == 'operatePart') { //操作部分
                range = []
            }
        }

        return range
    },
    getcolorGradation: function (color1, color2, value1, value2, value) {
        let rgb1 = color1.split(',')
        let r1 = parseInt(rgb1[0].split('(')[1])
        let g1 = parseInt(rgb1[1])
        let b1 = parseInt(rgb1[2].split(')')[0])

        let rgb2 = color2.split(',')
        let r2 = parseInt(rgb2[0].split('(')[1])
        let g2 = parseInt(rgb2[1])
        let b2 = parseInt(rgb2[2].split(')')[0])

        let r = Math.round(r1 - (r1 - r2) / (value1 - value2) * (value1 - value))
        let g = Math.round(g1 - (g1 - g2) / (value1 - value2) * (value1 - value))
        let b = Math.round(b1 - (b1 - b2) / (value1 - value2) * (value1 - value))

        return 'rgb(' + r + ', ' + g + ', ' + b + ')'
    },
    getCFPartRange: function (sheetIndex, range1, range2) {
        let ruleArr = []

        let cf = Store.luckysheetfile[getSheetIndex(sheetIndex)].luckysheet_conditionformat_save
        if (cf != null && cf.length > 0) {
            label:  for (let i = 0; i < cf.length; i++) {
                let cellrange = cf[i].cellrange

                for (let j = 0; j < cellrange.length; j++) {
                    let r1 = cellrange[j].row[0], r2 = cellrange[j].row[1]
                    let c1 = cellrange[j].column[0], c2 = cellrange[j].column[1]

                    for (let s = 0; s < range.length; s++) {
                        if ((range[s].row[0] >= r1 && range[s].row[0] <= r2) || (range[s].row[1] >= r1 && range[s].row[1] <= r2) || (range[s].column[0] >= c1 && range[s].column[0] <= c2) || (range[s].column[1] >= c1 && range[s].column[1] <= c2)) {
                            ruleArr.push(cf[i])

                            continue label
                        }
                    }
                }
            }
        }

        return ruleArr
    },
    checksCF: function (r, c, computeMap) {
        if (computeMap != null && (r + '_' + c) in computeMap) {
            return computeMap[r + '_' + c]
        } else {
            return null
        }
    },
    getComputeMap: function (sheetIndex) {
        let index = getSheetIndex(Store.currentSheetIndex)

        if (sheetIndex != null) {
            index = getSheetIndex(sheetIndex)
        }

        let ruleArr = Store.luckysheetfile[index]['luckysheet_conditionformat_save']
        let data = Store.luckysheetfile[index]['data']

        if (data == null) {
            return null
        }

        let computeMap = this.compute(ruleArr, data)

        return computeMap
    },
    compute: function (ruleArr, d) {
        let _this = this

        if (ruleArr == null) {
            ruleArr = []
        }

        //条件计算存储
        let computeMap = {}

        if (ruleArr.length > 0) {
            for (let i = 0; i < ruleArr.length; i++) {
                let type = ruleArr[i]['type']
                let cellrange = ruleArr[i]['cellrange']
                let format = ruleArr[i]['format']

                if (type == 'dataBar') { //数据条
                    let max = null, min = null

                    for (let s = 0; s < cellrange.length; s++) {
                        for (let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++) {
                            for (let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++) {
                                if (d[r] == null || d[r][c] == null) {
                                    continue
                                }

                                let cell = d[r][c]

                                if (getObjType(cell) == 'object' && cell['ct'] != null && cell['ct'].t == 'n' && cell.v != null) {
                                    if (max == null || parseInt(cell.v) > max) {
                                        max = parseInt(cell.v)
                                    }

                                    if (min == null || parseInt(cell.v) < min) {
                                        min = parseInt(cell.v)
                                    }
                                }
                            }
                        }
                    }

                    if (max != null && min != null) {
                        if (min < 0) { //选区范围内有负数
                            let plusLen = Math.round(max / (max - min) * 10) / 10                //正数所占比
                            let minusLen = Math.round(Math.abs(min) / (max - min) * 10) / 10     //负数所占比

                            for (let s = 0; s < cellrange.length; s++) {
                                for (let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++) {
                                    for (let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++) {
                                        if (d[r] == null || d[r][c] == null) {
                                            continue
                                        }

                                        let cell = d[r][c]

                                        if (getObjType(cell) == 'object' && cell['ct'] != null && cell['ct'].t == 'n' && cell.v != null) {
                                            if (parseInt(cell.v) < 0) { //负数
                                                let valueLen = Math.round(Math.abs(parseInt(cell.v)) / Math.abs(min) * 100) / 100

                                                if ((r + '_' + c) in computeMap) {
                                                    computeMap[r + '_' + c]['dataBar'] = {
                                                        'valueType': 'minus',
                                                        'minusLen': minusLen,
                                                        'valueLen': valueLen,
                                                        'format': format
                                                    }
                                                } else {
                                                    computeMap[r + '_' + c] = {
                                                        'dataBar': {
                                                            'valueType': 'minus',
                                                            'minusLen': minusLen,
                                                            'valueLen': valueLen,
                                                            'format': format
                                                        }
                                                    }
                                                }
                                            }

                                            if (parseInt(cell.v) > 0) { //正数
                                                let valueLen = Math.round(parseInt(cell.v) / max * 100) / 100

                                                if ((r + '_' + c) in computeMap) {
                                                    computeMap[r + '_' + c]['dataBar'] = {
                                                        'valueType': 'plus',
                                                        'plusLen': plusLen,
                                                        'minusLen': minusLen,
                                                        'valueLen': valueLen,
                                                        'format': format
                                                    }
                                                } else {
                                                    computeMap[r + '_' + c] = {
                                                        'dataBar': {
                                                            'valueType': 'plus',
                                                            'plusLen': plusLen,
                                                            'minusLen': minusLen,
                                                            'valueLen': valueLen,
                                                            'format': format
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        } else {
                            let plusLen = 1

                            for (let s = 0; s < cellrange.length; s++) {
                                for (let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++) {
                                    for (let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++) {
                                        if (d[r] == null || d[r][c] == null) {
                                            continue
                                        }

                                        let cell = d[r][c]

                                        if (getObjType(cell) == 'object' && cell['ct'] != null && cell['ct'].t == 'n' && cell.v != null) {
                                            let valueLen
                                            if (max == 0) {
                                                valueLen = 1
                                            } else {
                                                valueLen = Math.round(parseInt(cell.v) / max * 100) / 100
                                            }

                                            if ((r + '_' + c) in computeMap) {
                                                computeMap[r + '_' + c]['dataBar'] = {
                                                    'valueType': 'plus',
                                                    'plusLen': plusLen,
                                                    'valueLen': valueLen,
                                                    'format': format
                                                }
                                            } else {
                                                computeMap[r + '_' + c] = {
                                                    'dataBar': {
                                                        'valueType': 'plus',
                                                        'plusLen': plusLen,
                                                        'valueLen': valueLen,
                                                        'format': format
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                } else if (type == 'colorGradation') { //色阶
                    let max = null, min = null, sum = 0, count = 0

                    for (let s = 0; s < cellrange.length; s++) {
                        for (let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++) {
                            for (let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++) {
                                if (d[r] == null || d[r][c] == null) {
                                    continue
                                }

                                let cell = d[r][c]

                                if (getObjType(cell) == 'object' && cell['ct'] != null && cell['ct'].t == 'n' && cell.v != null) {
                                    count++
                                    sum += parseInt(cell.v)

                                    if (max == null || parseInt(cell.v) > max) {
                                        max = parseInt(cell.v)
                                    }

                                    if (min == null || parseInt(cell.v) < min) {
                                        min = parseInt(cell.v)
                                    }
                                }
                            }
                        }
                    }

                    if (max != null && min != null) {
                        if (format.length == 3) { //三色色阶
                            let avg = Math.floor(sum / count)

                            for (let s = 0; s < cellrange.length; s++) {
                                for (let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++) {
                                    for (let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++) {
                                        if (d[r] == null || d[r][c] == null) {
                                            continue
                                        }

                                        let cell = d[r][c]

                                        if (getObjType(cell) == 'object' && cell['ct'] != null && cell['ct'].t == 'n' && cell.v != null) {
                                            if (parseInt(cell.v) == min) {
                                                if ((r + '_' + c) in computeMap) {
                                                    computeMap[r + '_' + c]['cellColor'] = format[2]
                                                } else {
                                                    computeMap[r + '_' + c] = {'cellColor': format[2]}
                                                }
                                            } else if (parseInt(cell.v) > min && parseInt(cell.v) < avg) {
                                                if ((r + '_' + c) in computeMap) {
                                                    computeMap[r + '_' + c]['cellColor'] = _this.getcolorGradation(format[2], format[1], min, avg, parseInt(cell.v))
                                                } else {
                                                    computeMap[r + '_' + c] = {'cellColor': _this.getcolorGradation(format[2], format[1], min, avg, parseInt(cell.v))}
                                                }
                                            } else if (parseInt(cell.v) == avg) {
                                                if ((r + '_' + c) in computeMap) {
                                                    computeMap[r + '_' + c]['cellColor'] = format[1]
                                                } else {
                                                    computeMap[r + '_' + c] = {'cellColor': format[1]}
                                                }
                                            } else if (parseInt(cell.v) > avg && parseInt(cell.v) < max) {
                                                if ((r + '_' + c) in computeMap) {
                                                    computeMap[r + '_' + c]['cellColor'] = _this.getcolorGradation(format[1], format[0], avg, max, parseInt(cell.v))
                                                } else {
                                                    computeMap[r + '_' + c] = {'cellColor': _this.getcolorGradation(format[1], format[0], avg, max, parseInt(cell.v))}
                                                }
                                            } else if (parseInt(cell.v) == max) {
                                                if ((r + '_' + c) in computeMap) {
                                                    computeMap[r + '_' + c]['cellColor'] = format[0]
                                                } else {
                                                    computeMap[r + '_' + c] = {'cellColor': format[0]}
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        } else if (format.length == 2) { //两色色阶
                            for (let s = 0; s < cellrange.length; s++) {
                                for (let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++) {
                                    for (let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++) {
                                        if (d[r] == null || d[r][c] == null) {
                                            continue
                                        }

                                        let cell = d[r][c]

                                        if (getObjType(cell) == 'object' && cell['ct'] != null && cell['ct'].t == 'n' && cell.v != null) {
                                            if (parseInt(cell.v) == min) {
                                                if ((r + '_' + c) in computeMap) {
                                                    computeMap[r + '_' + c]['cellColor'] = format[1]
                                                } else {
                                                    computeMap[r + '_' + c] = {'cellColor': format[1]}
                                                }
                                            } else if (parseInt(cell.v) > min && parseInt(cell.v) < max) {
                                                if ((r + '_' + c) in computeMap) {
                                                    computeMap[r + '_' + c]['cellColor'] = _this.getcolorGradation(format[1], format[0], min, max, parseInt(cell.v))
                                                } else {
                                                    computeMap[r + '_' + c] = {'cellColor': _this.getcolorGradation(format[1], format[0], min, max, parseInt(cell.v))}
                                                }
                                            } else if (parseInt(cell.v) == max) {
                                                if ((r + '_' + c) in computeMap) {
                                                    computeMap[r + '_' + c]['cellColor'] = format[0]
                                                } else {
                                                    computeMap[r + '_' + c] = {'cellColor': format[0]}
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                } else if (type == 'icons') { //图标集
                    let len = parseInt(format['len'])
                    let leftMin = parseInt(format['leftMin'])
                    let top = parseInt(format['top'])

                    let max = null, min = null

                    for (let s = 0; s < cellrange.length; s++) {
                        for (let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++) {
                            for (let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++) {
                                if (d[r] == null || d[r][c] == null) {
                                    continue
                                }

                                let cell = d[r][c]

                                if (getObjType(cell) == 'object' && cell['ct'] != null && cell['ct'].t == 'n' && cell.v != null) {
                                    if (max == null || parseInt(cell.v) > max) {
                                        max = parseInt(cell.v)
                                    }

                                    if (min == null || parseInt(cell.v) < min) {
                                        min = parseInt(cell.v)
                                    }
                                }
                            }
                        }
                    }

                    if (max != null && min != null) {
                        let a = Math.floor((max - min + 1) / len)
                        let b = (max - min + 1) % len

                        if (len == 3) { //一组图标有三个
                            let v1, v2, v3
                            if (b == 2) {
                                v1 = [min, min + a]
                                v2 = [min + a + 1, min + a * 2]
                                v3 = [min + a * 2 + 1, max]
                            } else {
                                v1 = [min, min + a - 1]
                                v2 = [min + a, min + a * 2 - 1]
                                v3 = [min + a * 2, max]
                            }

                            for (let s = 0; s < cellrange.length; s++) {
                                for (let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++) {
                                    for (let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++) {
                                        if (d[r] == null || d[r][c] == null) {
                                            continue
                                        }

                                        let cell = d[r][c]

                                        if (getObjType(cell) == 'object' && cell['ct'] != null && cell['ct'].t == 'n' && cell.v != null) {
                                            if (parseInt(cell.v) >= v1[0] && parseInt(cell.v) <= v1[1]) {
                                                if ((r + '_' + c) in computeMap) {
                                                    computeMap[r + '_' + c]['icons'] = {
                                                        'left': leftMin + 2,
                                                        'top': top
                                                    }
                                                } else {
                                                    computeMap[r + '_' + c] = {
                                                        'icons': {
                                                            'left': leftMin + 2,
                                                            'top': top
                                                        }
                                                    }
                                                }
                                            } else if (parseInt(cell.v) >= v2[0] && parseInt(cell.v) <= v2[1]) {
                                                if ((r + '_' + c) in computeMap) {
                                                    computeMap[r + '_' + c]['icons'] = {
                                                        'left': leftMin + 1,
                                                        'top': top
                                                    }
                                                } else {
                                                    computeMap[r + '_' + c] = {
                                                        'icons': {
                                                            'left': leftMin + 1,
                                                            'top': top
                                                        }
                                                    }
                                                }
                                            } else if (parseInt(cell.v) >= v3[0] && parseInt(cell.v) <= v3[1]) {
                                                if ((r + '_' + c) in computeMap) {
                                                    computeMap[r + '_' + c]['icons'] = {'left': leftMin, 'top': top}
                                                } else {
                                                    computeMap[r + '_' + c] = {'icons': {'left': leftMin, 'top': top}}
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        } else if (len == 4) { //一组图标有四个
                            let v1, v2, v3, v4
                            if (b == 2) {
                                v1 = [min, min + a]
                                v2 = [min + a + 1, min + a * 2]
                                v3 = [min + a * 2 + 1, min + a * 3]
                                v4 = [min + a * 3 + 1, max]
                            } else if (b == 3) {
                                v1 = [min, min + a]
                                v2 = [min + a + 1, min + a * 2]
                                v3 = [min + a * 2 + 1, min + a * 3 + 1]
                                v4 = [min + a * 3 + 2, max]
                            } else {
                                v1 = [min, min + a - 1]
                                v2 = [min + a, min + a * 2 - 1]
                                v3 = [min + a * 2, min + a * 3 - 1]
                                v4 = [min + a * 3, max]
                            }

                            for (let s = 0; s < cellrange.length; s++) {
                                for (let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++) {
                                    for (let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++) {
                                        if (d[r] == null || d[r][c] == null) {
                                            continue
                                        }

                                        let cell = d[r][c]

                                        if (getObjType(cell) == 'object' && cell['ct'] != null && cell['ct'].t == 'n' && cell.v != null) {
                                            if (parseInt(cell.v) >= v1[0] && parseInt(cell.v) <= v1[1]) {
                                                if ((r + '_' + c) in computeMap) {
                                                    computeMap[r + '_' + c]['icons'] = {
                                                        'left': leftMin + 3,
                                                        'top': top
                                                    }
                                                } else {
                                                    computeMap[r + '_' + c] = {
                                                        'icons': {
                                                            'left': leftMin + 3,
                                                            'top': top
                                                        }
                                                    }
                                                }
                                            } else if (parseInt(cell.v) >= v2[0] && parseInt(cell.v) <= v2[1]) {
                                                if ((r + '_' + c) in computeMap) {
                                                    computeMap[r + '_' + c]['icons'] = {
                                                        'left': leftMin + 2,
                                                        'top': top
                                                    }
                                                } else {
                                                    computeMap[r + '_' + c] = {
                                                        'icons': {
                                                            'left': leftMin + 2,
                                                            'top': top
                                                        }
                                                    }
                                                }
                                            } else if (parseInt(cell.v) >= v3[0] && parseInt(cell.v) <= v3[1]) {
                                                if ((r + '_' + c) in computeMap) {
                                                    computeMap[r + '_' + c]['icons'] = {
                                                        'left': leftMin + 1,
                                                        'top': top
                                                    }
                                                } else {
                                                    computeMap[r + '_' + c] = {
                                                        'icons': {
                                                            'left': leftMin + 1,
                                                            'top': top
                                                        }
                                                    }
                                                }
                                            } else if (parseInt(cell.v) >= v4[0] && parseInt(cell.v) <= v4[1]) {
                                                if ((r + '_' + c) in computeMap) {
                                                    computeMap[r + '_' + c]['icons'] = {'left': leftMin, 'top': top}
                                                } else {
                                                    computeMap[r + '_' + c] = {'icons': {'left': leftMin, 'top': top}}
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        } else if (len == 5) { //一组图标有五个
                            let v1, v2, v3, v4, v5
                            if (b == 2) {
                                v1 = [min, min + a]
                                v2 = [min + a + 1, min + a * 2]
                                v3 = [min + a * 2 + 1, min + a * 3]
                                v4 = [min + a * 3 + 1, min + a * 4]
                                v5 = [min + a * 4 + 1, max]
                            } else if (b == 3) {
                                v1 = [min, min + a]
                                v2 = [min + a + 1, min + a * 2]
                                v3 = [min + a * 2 + 1, min + a * 3 + 1]
                                v4 = [min + a * 3 + 2, min + a * 4 + 1]
                                v5 = [min + a * 4 + 2, max]
                            } else if (b == 4) {
                                v1 = [min, min + a]
                                v2 = [min + a + 1, min + a * 2 + 1]
                                v3 = [min + a * 2 + 2, min + a * 3 + 1]
                                v4 = [min + a * 3 + 2, min + a * 4 + 2]
                                v5 = [min + a * 4 + 3, max]
                            } else {
                                v1 = [min, min + a - 1]
                                v2 = [min + a, min + a * 2 - 1]
                                v3 = [min + a * 2, min + a * 3 - 1]
                                v4 = [min + a * 3, min + a * 4 - 1]
                                v5 = [min + a * 4, max]
                            }

                            for (let s = 0; s < cellrange.length; s++) {
                                for (let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++) {
                                    for (let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++) {
                                        if (d[r] == null || d[r][c] == null) {
                                            continue
                                        }

                                        let cell = d[r][c]

                                        if (getObjType(cell) == 'object' && cell['ct'] != null && cell['ct'].t == 'n' && cell.v != null) {
                                            if (parseInt(cell.v) >= v1[0] && parseInt(cell.v) <= v1[1]) {
                                                if ((r + '_' + c) in computeMap) {
                                                    computeMap[r + '_' + c]['icons'] = {
                                                        'left': leftMin + 4,
                                                        'top': top
                                                    }
                                                } else {
                                                    computeMap[r + '_' + c] = {
                                                        'icons': {
                                                            'left': leftMin + 4,
                                                            'top': top
                                                        }
                                                    }
                                                }
                                            } else if (parseInt(cell.v) >= v2[0] && parseInt(cell.v) <= v2[1]) {
                                                if ((r + '_' + c) in computeMap) {
                                                    computeMap[r + '_' + c]['icons'] = {
                                                        'left': leftMin + 3,
                                                        'top': top
                                                    }
                                                } else {
                                                    computeMap[r + '_' + c] = {
                                                        'icons': {
                                                            'left': leftMin + 3,
                                                            'top': top
                                                        }
                                                    }
                                                }
                                            } else if (parseInt(cell.v) >= v3[0] && parseInt(cell.v) <= v3[1]) {
                                                if ((r + '_' + c) in computeMap) {
                                                    computeMap[r + '_' + c]['icons'] = {
                                                        'left': leftMin + 2,
                                                        'top': top
                                                    }
                                                } else {
                                                    computeMap[r + '_' + c] = {
                                                        'icons': {
                                                            'left': leftMin + 2,
                                                            'top': top
                                                        }
                                                    }
                                                }
                                            } else if (parseInt(cell.v) >= v4[0] && parseInt(cell.v) <= v4[1]) {
                                                if ((r + '_' + c) in computeMap) {
                                                    computeMap[r + '_' + c]['icons'] = {
                                                        'left': leftMin + 1,
                                                        'top': top
                                                    }
                                                } else {
                                                    computeMap[r + '_' + c] = {
                                                        'icons': {
                                                            'left': leftMin + 1,
                                                            'top': top
                                                        }
                                                    }
                                                }
                                            } else if (parseInt(cell.v) >= v5[0] && parseInt(cell.v) <= v5[1]) {
                                                if ((r + '_' + c) in computeMap) {
                                                    computeMap[r + '_' + c]['icons'] = {'left': leftMin, 'top': top}
                                                } else {
                                                    computeMap[r + '_' + c] = {'icons': {'left': leftMin, 'top': top}}
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                } else {
                    //获取变量值
                    let conditionName = ruleArr[i].conditionName,         //条件名称
                        conditionValue0 = ruleArr[i].conditionValue[0],   //条件值1
                        conditionValue1 = ruleArr[i].conditionValue[1],   //条件值2
                        textColor = format.textColor,          //条件格式文本颜色 fc
                        cellColor = format.cellColor          //条件格式单元格颜色 bg

                    for (let s = 0; s < cellrange.length; s++) {
                        //条件类型判断
                        if (conditionName == 'greaterThan' || conditionName == 'lessThan' || conditionName == 'equal' || conditionName == 'textContains') {
                            //循环应用范围计算
                            for (let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++) {
                                for (let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++) {
                                    if (d[r] == null || d[r][c] == null) {
                                        continue
                                    }

                                    //单元格值
                                    let cell = d[r][c]

                                    if (getObjType(cell) != 'object' || isRealNull(cell.v)) {
                                        continue
                                    }

                                    //符合条件
                                    if (conditionName == 'greaterThan' && cell.v > conditionValue0) {
                                        if ((r + '_' + c) in computeMap) {
                                            computeMap[r + '_' + c]['textColor'] = textColor
                                            computeMap[r + '_' + c]['cellColor'] = cellColor
                                        } else {
                                            computeMap[r + '_' + c] = {'textColor': textColor, 'cellColor': cellColor}
                                        }
                                    } else if (conditionName == 'lessThan' && cell.v < conditionValue0) {
                                        if ((r + '_' + c) in computeMap) {
                                            computeMap[r + '_' + c]['textColor'] = textColor
                                            computeMap[r + '_' + c]['cellColor'] = cellColor
                                        } else {
                                            computeMap[r + '_' + c] = {'textColor': textColor, 'cellColor': cellColor}
                                        }
                                    } else if (conditionName == 'equal' && cell.v == conditionValue0) {
                                        if ((r + '_' + c) in computeMap) {
                                            computeMap[r + '_' + c]['textColor'] = textColor
                                            computeMap[r + '_' + c]['cellColor'] = cellColor
                                        } else {
                                            computeMap[r + '_' + c] = {'textColor': textColor, 'cellColor': cellColor}
                                        }
                                    } else if (conditionName == 'textContains' && cell.v.toString().indexOf(conditionValue0) != -1) {
                                        if ((r + '_' + c) in computeMap) {
                                            computeMap[r + '_' + c]['textColor'] = textColor
                                            computeMap[r + '_' + c]['cellColor'] = cellColor
                                        } else {
                                            computeMap[r + '_' + c] = {'textColor': textColor, 'cellColor': cellColor}
                                        }
                                    }
                                }
                            }
                        } else if (conditionName == 'betweenness') {
                            //比较条件值1和条件值2的大小
                            let vBig, vSmall
                            if (conditionValue0 > conditionValue1) {
                                vBig = conditionValue0
                                vSmall = conditionValue1
                            } else {
                                vBig = conditionValue1
                                vSmall = conditionValue0
                            }
                            //循环应用范围计算
                            for (let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++) {
                                for (let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++) {
                                    if (d[r] == null || d[r][c] == null) {
                                        continue
                                    }

                                    //单元格值
                                    let cell = d[r][c]

                                    if (getObjType(cell) != 'object' || isRealNull(cell.v)) {
                                        continue
                                    }

                                    //符合条件
                                    if (cell.v >= vSmall && cell.v <= vBig) {
                                        if ((r + '_' + c) in computeMap) {
                                            computeMap[r + '_' + c]['textColor'] = textColor
                                            computeMap[r + '_' + c]['cellColor'] = cellColor
                                        } else {
                                            computeMap[r + '_' + c] = {'textColor': textColor, 'cellColor': cellColor}
                                        }
                                    }
                                }
                            }
                        } else if (conditionName == 'occurrenceDate') {
                            //获取日期所对应的数值
                            let dBig, dSmall
                            if (conditionValue0.toString().indexOf('-') == -1) {
                                dBig = genarate(conditionValue0)[2]
                                dSmall = genarate(conditionValue0)[2]
                            } else {
                                let str = conditionValue0.toString().split('-')
                                dBig = genarate(str[1].trim())[2]
                                dSmall = genarate(str[0].trim())[2]
                            }
                            //循环应用范围计算
                            for (let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++) {
                                for (let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++) {
                                    if (d[r] == null || d[r][c] == null) {
                                        continue
                                    }

                                    //单元格值类型为日期类型
                                    if (d[r][c].ct != null && d[r][c].ct.t == 'd') {
                                        //单元格值
                                        let cellVal = getcellvalue(r, c, d)
                                        //符合条件
                                        if (cellVal >= dSmall && cellVal <= dBig) {
                                            if ((r + '_' + c) in computeMap) {
                                                computeMap[r + '_' + c]['textColor'] = textColor
                                                computeMap[r + '_' + c]['cellColor'] = cellColor
                                            } else {
                                                computeMap[r + '_' + c] = {
                                                    'textColor': textColor,
                                                    'cellColor': cellColor
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        } else if (conditionName == 'duplicateValue') {
                            //应用范围单元格值处理
                            let dmap = {}
                            for (let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++) {
                                for (let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++) {
                                    let item = getcellvalue(r, c, d)
                                    if (!(item in dmap)) {
                                        dmap[item] = []
                                    }
                                    dmap[item].push({'r': r, 'c': c})
                                }
                            }
                            //循环应用范围计算
                            if (conditionValue0 == '0') {//重复值
                                for (let x in dmap) {
                                    if (x != 'null' && x != 'undefined' && dmap[x].length > 1) {
                                        for (let j = 0; j < dmap[x].length; j++) {
                                            if ((dmap[x][j].r + '_' + dmap[x][j].c) in computeMap) {
                                                computeMap[dmap[x][j].r + '_' + dmap[x][j].c]['textColor'] = textColor
                                                computeMap[dmap[x][j].r + '_' + dmap[x][j].c]['cellColor'] = cellColor
                                            } else {
                                                computeMap[dmap[x][j].r + '_' + dmap[x][j].c] = {
                                                    'textColor': textColor,
                                                    'cellColor': cellColor
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                            if (conditionValue0 == '1') {//唯一值
                                for (let x in dmap) {
                                    if (x != 'null' && x != 'undefined' && dmap[x].length == 1) {
                                        if ((dmap[x][0].r + '_' + dmap[x][0].c) in computeMap) {
                                            computeMap[dmap[x][0].r + '_' + dmap[x][0].c]['textColor'] = textColor
                                            computeMap[dmap[x][0].r + '_' + dmap[x][0].c]['cellColor'] = cellColor
                                        } else {
                                            computeMap[dmap[x][0].r + '_' + dmap[x][0].c] = {
                                                'textColor': textColor,
                                                'cellColor': cellColor
                                            }
                                        }
                                    }
                                }
                            }
                        } else if (conditionName == 'top10' || conditionName == 'top10%' || conditionName == 'last10' || conditionName == 'last10%' || conditionName == 'AboveAverage' || conditionName == 'SubAverage') {
                            //应用范围单元格值(数值型)
                            let dArr = []
                            for (let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++) {
                                for (let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++) {
                                    if (d[r] == null || d[r][c] == null) {
                                        continue
                                    }

                                    //单元格值类型为数字类型
                                    if (d[r][c].ct != null && d[r][c].ct.t == 'n') {
                                        dArr.push(getcellvalue(r, c, d))
                                    }
                                }
                            }
                            //数组处理
                            if (conditionName == 'top10' || conditionName == 'top10%' || conditionName == 'last10' || conditionName == 'last10%') {
                                //从大到小排序
                                for (let j = 0; j < dArr.length; j++) {
                                    for (let k = 0; k < dArr.length - 1 - j; k++) {
                                        if (dArr[k] < dArr[k + 1]) {
                                            let temp = dArr[k]
                                            dArr[k] = dArr[k + 1]
                                            dArr[k + 1] = temp
                                        }
                                    }
                                }
                                //取条件值数组
                                let cArr
                                if (conditionName == 'top10') {
                                    cArr = dArr.slice(0, conditionValue0) //前10项数组
                                } else if (conditionName == 'top10%') {
                                    cArr = dArr.slice(0, Math.floor(conditionValue0 * dArr.length / 100)) //前10%数组
                                } else if (conditionName == 'last10') {
                                    cArr = dArr.slice((dArr.length - conditionValue0), dArr.length) //最后10项数组
                                } else if (conditionName == 'last10%') {
                                    cArr = dArr.slice((dArr.length - Math.floor(conditionValue0 * dArr.length / 100)), dArr.length) //最后10%数组
                                }
                                //循环应用范围计算
                                for (let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++) {
                                    for (let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++) {
                                        if (d[r] == null || d[r][c] == null) {
                                            continue
                                        }

                                        //单元格值
                                        let cellVal = getcellvalue(r, c, d)
                                        //符合条件
                                        if (cArr.indexOf(cellVal) != -1) {
                                            if ((r + '_' + c) in computeMap) {
                                                computeMap[r + '_' + c]['textColor'] = textColor
                                                computeMap[r + '_' + c]['cellColor'] = cellColor
                                            } else {
                                                computeMap[r + '_' + c] = {
                                                    'textColor': textColor,
                                                    'cellColor': cellColor
                                                }
                                            }
                                        }
                                    }
                                }
                            } else if (conditionName == 'AboveAverage' || conditionName == 'SubAverage') {
                                //计算数组平均值
                                let sum = 0
                                for (let j = 0; j < dArr.length; j++) {
                                    sum += dArr[j]
                                }
                                let averageNum = sum / dArr.length
                                //循环应用范围计算
                                if (conditionName == 'AboveAverage') { //高于平均值
                                    for (let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++) {
                                        for (let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++) {
                                            if (d[r] == null || d[r][c] == null) {
                                                continue
                                            }

                                            //单元格值
                                            let cellVal = getcellvalue(r, c, d)
                                            //符合条件
                                            if (cellVal > averageNum) {
                                                if ((r + '_' + c) in computeMap) {
                                                    computeMap[r + '_' + c]['textColor'] = textColor
                                                    computeMap[r + '_' + c]['cellColor'] = cellColor
                                                } else {
                                                    computeMap[r + '_' + c] = {
                                                        'textColor': textColor,
                                                        'cellColor': cellColor
                                                    }
                                                }
                                            }
                                        }
                                    }
                                } else if (conditionName == 'SubAverage') { //低于平均值
                                    for (let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++) {
                                        for (let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++) {
                                            if (d[r] == null || d[r][c] == null) {
                                                continue
                                            }

                                            //单元格值
                                            let cellVal = getcellvalue(r, c, d)
                                            //符合条件
                                            if (cellVal < averageNum) {
                                                if ((r + '_' + c) in computeMap) {
                                                    computeMap[r + '_' + c]['textColor'] = textColor
                                                    computeMap[r + '_' + c]['cellColor'] = cellColor
                                                } else {
                                                    computeMap[r + '_' + c] = {
                                                        'textColor': textColor,
                                                        'cellColor': cellColor
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        } else if (conditionName == 'formula') {
                            let str = cellrange[s].row[0],
                                edr = cellrange[s].row[1],
                                stc = cellrange[s].column[0],
                                edc = cellrange[s].column[1]

                            let formulaTxt = conditionValue0
                            if (conditionValue0.toString().slice(0, 1) != '=') {
                                formulaTxt = '=' + conditionValue0
                            }

                            for (let r = str; r <= edr; r++) {
                                for (let c = stc; c <= edc; c++) {
                                    let func = formulaTxt
                                    let offsetRow = r - str
                                    let offsetCol = c - stc

                                    if (offsetRow > 0) {
                                        func = '=' + formula.functionCopy(func, 'down', offsetRow)
                                    }

                                    if (offsetCol > 0) {
                                        func = '=' + formula.functionCopy(func, 'right', offsetCol)
                                    }

                                    let funcV = formula.execfunction(func)
                                    let v = funcV[1]

                                    if (typeof v != 'boolean') {
                                        v = !!Number(v)
                                    }

                                    if (!v) {
                                        continue
                                    }

                                    if ((r + '_' + c) in computeMap) {
                                        computeMap[r + '_' + c]['textColor'] = textColor
                                        computeMap[r + '_' + c]['cellColor'] = cellColor
                                    } else {
                                        computeMap[r + '_' + c] = {'textColor': textColor, 'cellColor': cellColor}
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }

        return computeMap
    },
    updateItem: function (type, cellrange, format) {
        if (!checkProtectionFormatCells(Store.currentSheetIndex)) {
            return
        }

        let _this = this
        let index = getSheetIndex(Store.currentSheetIndex)

        //保存之前的规则
        let fileH = $.extend(true, [], Store.luckysheetfile)
        let historyRules = _this.getHistoryRules(fileH)

        //保存当前的规则
        let ruleArr
        if (type == 'delSheet') {
            ruleArr = []
        } else {
            let rule = {
                'type': type,
                'cellrange': cellrange,
                'format': format
            }
            ruleArr = Store.luckysheetfile[index]['luckysheet_conditionformat_save'] == null ? [] : Store.luckysheetfile[index]['luckysheet_conditionformat_save']
            ruleArr.push(rule)
        }

        Store.luckysheetfile[index]['luckysheet_conditionformat_save'] = ruleArr

        let fileC = $.extend(true, [], Store.luckysheetfile)
        let currentRules = _this.getCurrentRules(fileC)

        //刷新一次表格
        _this.ref(historyRules, currentRules)

        //发送给后台
        if (server.allowUpdate) {
            server.saveParam('all', Store.currentSheetIndex, ruleArr, {'k': 'luckysheet_conditionformat_save'})
        }
    },
    getHistoryRules: function (fileH) {
        let historyRules = []

        for (let h = 0; h < fileH.length; h++) {
            historyRules.push({
                'sheetIndex': fileH[h]['index'],
                'luckysheet_conditionformat_save': fileH[h]['luckysheet_conditionformat_save']
            })
        }

        return historyRules
    },
    getCurrentRules: function (fileC) {
        let currentRules = []

        for (let c = 0; c < fileC.length; c++) {
            currentRules.push({
                'sheetIndex': fileC[c]['index'],
                'luckysheet_conditionformat_save': fileC[c]['luckysheet_conditionformat_save']
            })
        }

        return currentRules
    },
    ref: function (historyRules, currentRules) {
        if (Store.clearjfundo) {
            Store.jfundo.length = 0

            let redo = {}
            redo['type'] = 'updateCF'
            redo['data'] = {'historyRules': historyRules, 'currentRules': currentRules}
            Store.jfredo.push(redo)
        }

        setTimeout(function () {
            luckysheetrefreshgrid()
        }, 1)
    }
}

export default conditionformat
